考虑这个非常简单的例子,我有模板包装类,其中定义了运算符:
template <class T>
struct W {
W(const T&) {}
};
template <class T>
T operator + (const W<T>& w1, const W<T>& w2) { return T(); }
这令人惊讶地无法匹配包装类型,来自 gcc4.5.1 的简单错误无法找到operator + (A,A)
:
struct A {};
int main() {
A a1, a2;
A a3 = a1 + a2;
}
我试图通过测试非模板包装器来找到原因,但这个版本有效:
struct A {};
struct WA {
WA(const A&) {}
};
A operator + (const WA& w1, const WA& w2) { return A(); }
int main() {
A a1, a2;
A a3 = a1 + a2;
}
这种参数匹配差异的原因是什么,如何使模板版本有效?
[更新]
我考虑了您的答案,并且我将示例更改为稍微相反的方式,但结果仍然相同 - 模板版本抱怨缺少运算符 +,而非模板工作正常。现在我有明确的强制转换运算符到明确的包装类:
模板版本
template <class T>
struct W {
};
template <class T>
T operator + (const W<T>& w1, const W<T>& w2) { return T(); }
struct A {
operator W<A>() const { return W<A>(); }
};
不是模板
struct WA {
};
struct A {
operator WA() const { return WA(); }
};
A operator + (const WA& w1, const WA& w2) { return A(); }
我试图避免这种解决方案:
A a3 = W(a1) + W(a2);
没有希望这行得通?
A a3 = a1 + a2;