Я не смог найти лучший заголовок, но не стесняйтесь его модифицировать, если у вас есть правильная идея. Как бы то ни было, это лучше, чем GCC и clang.
Я пытаюсь выяснить, что не так в этом коде:
template <typename... T>
struct S;
template <typename T, typename... U>
struct S<T, U...>: S<U...> {
using S<U...>::f;
template<void(*F)(const T &)>
void f() { }
};
template<>
struct S<> {
void f();
};
template<typename... T>
struct R: S<T...> {
using S<T...>::f;
template<typename U, void(*F)(const U &)>
void g() {
this->template f<F>();
}
};
void h(const double &) { }
int main() {
R<int, double> r;
r.g<double, h>();
}
Он компилируется с GCC 4.9 (см. здесь), но он не компилируется с clang 3.8.0 (см. здесь).
Какой компилятор прав и почему?
Более того, что я мог сделать, чтобы увидеть компиляцию кода вместе с компиляторами?