基本クラスを期待するテンプレート関数に(複数の)派生クラスを渡すときのテンプレートのインスタンス化のルールは何ですか?例えば: - 1とGCC 6.2コンパイラエラー(Demo)を与える複数のテンプレート継承を使用したテンプレートのインスタンス化
#include <iostream>
template <int x>
struct C {};
struct D : C<0>, C<1> {};
template <int x>
void f (const C<x> &y) { std::cout << x << "\n"; }
int main()
{
f (D());
}
MSVC 2015プリント0、3.8を打ち鳴らします。そして、一つでも除いて、あなたSFINAE-離れてすべてのオーバーロード場合、結果はやはり違うようになります。
#include <iostream>
template <int x> struct C {};
template<>
struct C<0> { using type = void; };
struct D : C<0>, C<1> {};
template <int x, typename = typename C<x>::type>
void f (const C<x> &y) { std::cout << x << "\n"; }
int main()
{
f (D());
}
今ではMSVCでのみコンパイルし、あなたがC<0>
を交換し、C<1>
場合のみ打ち鳴らすには、それをコンパイルします。問題は、MSVCが最初のベース、clang-lastおよびgccのエラーをあまりに早くインスタンス化しようとすることだけです。どのコンパイラが正しいのですか?
彼らはすべて間違っているかのように私に見えます。あいまいな関数呼び出しであってはなりませんか? –
* "MSVCは0、clang - 1を出力し、gccはコンパイラエラーを出力します。" *、どのMSVC、どのgcc? –
@PiotrSkotnickiバージョン番号を追加しましたが、それらはすべて同じように動作します –