与操作员的好奇重复模板

时间:2011-04-08 09:09:33

标签: c++ templates

我有这个工作在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类中定义的运算符*时,这只会分崩离析。

1 个答案:

答案 0 :(得分:4)

我不知道你是怎么设法通过g ++编译的(我实际上对此表示怀疑),但你的代码确实无法编译,原因相当明显。您的Bar课程只展示一个operator *

Bar& operator * (const Bar& boo)

并且该运算符期望Bar对象作为右手大小的操作数。 3无效,3不是Bar且无法转换为Bar

基类operator *是可能在这里工作的基类,但它被派生类的运算符隐藏。正如人们所预料的那样,删除派生类operator *可以消除错误。

您只需添加

即可
using Foo<T, Bar<T> >::operator *;

Bar的定义,取消隐藏基类的运算符,它应该编译。