我有这个工作在G ++上,但在Visual Studo 2008上,这将无法编译。
template<typename T, typename DerivedT >
struct Foo
{
template<typename Scale>
DerivedT operator * (const Scale i)
{
DerivedT result;
return result;
}
};
template<typename T>
struct Bar : public Foo<T, Bar<T> >
{
// Removing this operator gets rid of the error.
Bar& operator * (const Bar& boo)
{
return *this;
}
};
int main()
{
Bar<float> bar;
bar = bar * 3;
return 0;
}
我收到错误
Error 1 error C2679: binary '*' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
即使我将Foo运算符显式定义为int / double / float,它也会返回相同的错误消息。有没有办法解决这个问题?
修改 当派生类重载也在Base类中定义的运算符*时,这只会分崩离析。
答案 0 :(得分:4)
我不知道你是怎么设法通过g ++编译的(我实际上对此表示怀疑),但你的代码确实无法编译,原因相当明显。您的Bar
课程只展示一个operator *
Bar& operator * (const Bar& boo)
并且该运算符期望Bar
对象作为右手大小的操作数。 3
无效,3
不是Bar
且无法转换为Bar
。
基类operator *
是可能在这里工作的基类,但它被派生类的运算符隐藏。正如人们所预料的那样,删除派生类operator *
可以消除错误。
您只需添加
即可using Foo<T, Bar<T> >::operator *;
到Bar
的定义,取消隐藏基类的运算符,它应该编译。