テンプレートメソッドを持つテンプレート基本クラスがある場合:
template <typename T>
class S
{
public:
template <typename U>
void f(U p, typename enable_if<is_same<T, U> >::type*dummy = 0)
{
std::cout << p << std::endl;
}
};
例として、メソッドを単純化します。T == U の場合にのみ「存在」する必要があります。
A がこのクラスの場合:
class A : public S<int> {};
それから私は私が欲しいものを持っています:
int i = 1;
A a;
a.f(i);
コンパイルしますが、
double d = 2.0;
a.f(d);
コンパイルされません : エラー: 'A::f(double&)' の呼び出しに一致する関数がありません これは予期された動作です。
S<double>
次に、 Aも継承しましょう。
class A : public S<int>, public S<double> {};
次に、次のコードはコンパイルされません。
int i = 1;
A a;
a.f(i);
error: request for member ‘f’ is ambiguous error: candidates are: template<class U> void S::f(U, typename boost::enable_if<boost::is_same<T, U>, void>::type*) [with U = U, T = double] error: template<class U> void S::f(U, typename boost::enable_if<boost::is_same<T, U>, void>::type*) [with U = U, T = int]
私はあいまいさがないことを期待しました: のf<int>
ためにのみ存在しますS<int>
コンパイラ エラーでは、このコードがコンパイルされた時点で T は認識されていますが、U (U = U) は認識されていないことがわかります。
説明または「回避策」はありますか?