如果我有一个带有模板方法的模板基类:
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&)' 这是预期的行为。
现在让我们 A 也继承自S<double>
:
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)。
任何解释或“解决方法”?