如果我有一個模板基類與模板方法:enable_if:一個模板庫的模板化方法的情況下繼承幾次
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 ==ü
如果A是這個類:
class A : public S<int> {};
然後,我有我想要的東西:
int i = 1;
A a;
a.f(i);
編譯,但
double d = 2.0;
a.f(d);
不會編譯:錯誤:調用「A :: F(雙&)」 這是預期的行爲沒有匹配的功能。
,現在讓我們從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)。
任何解釋或「解決方法」?
爲什麼'f'必須被模板化? – Xeo
建立在@ Xeo的評論上:既然你希望'f'的參數是'T',爲什麼不直接說'enable_if'呢?'template struct S {void f(T p){std :: cout << p << std :: endl; }};' –
(我剛剛重讀了你的問題,看到你說的方法被簡化了,所以也許你的實際代碼真的需要'f'作爲方法模板)。 –