私はより良いタイトルを見つけることができませんでしたが、あなたが正しい考えを持っている場合は、それを自由に変更してください。そのままで、それはよりも優れています。とにかくGCC vs clangです。Variadicテンプレートと関数のポインタ:どのコンパイラが正しいのですか?
私はこのコードで間違っているかを把握しようとしている:
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(hereを参照)でコンパイルが、それは打ち鳴らす3.8でコンパイルされません。 .(here参照)。
正しいコンパイラとその理由は何ですか?
さらに、両方のコンパイラでコンパイルされたコードを見るにはどうすればよいですか?
それは(まだテスト)奇妙だと今の私は疑問にフラグ「可変引数-テンプレート」を追加提案することができます。 – Radek
ICCでもこれをコンパイルできないようです:https://godbolt.org/g/N67e2z – NathanOliver
[この質問に関連するかもしれません](http://stackoverflow.com/questions/8629839/c-candidate-template-ignored -invalid-explicit-specified-for-templ)または[この質問](http://stackoverflow.com/questions/33872039/invalid-explicitly-specified-argument-in-clang-but-successful-compilation-in -gcc)? – callyalater