重载和模板组合

时间:2012-01-02 12:52:17

标签: c++

下面的代码使我感到困惑:

  1. 我期待operator+<int>给出编译时错误,因为运算符重载要求至少一个非内在类型。如果我尝试int operator+(int i, int j)则失败。但它没有造成任何问题,为什么?

  2. 如果我致电2+3并且没有致电operator+,我必须明确operator+<int>吗?

  3. 是否有更好的方式,然后写operator+<int>来调用operator+的定义?

  4. 是否有可以参考的地方,哪个更好地解释了?

  5. 注意:我使用了“Sun C ++ 5.10”

    #include <iostream>
    
    using namespace std;
    
    template <typename T>
    T operator+(T i, T j)
    {
            return i+j;
    }
    
    int main()
    {
            cout<<2+3;
            cout<<operator+<int>(2,3);
            cout<<endl;
    }
    

    输出如下,

    bash-2.03$ ./a.out
    
    55
    

1 个答案:

答案 0 :(得分:1)

我认为这个问题的答案相对简单:这是编译错误!相关引用已超过第6段,第一句(C ++ 2011):

  

运算符函数应该是非静态成员函数或者是非成员函数,并且至少有一个参数,其类型是类,对类的引用,枚举或对枚举的引用。

我使用当前版本的EDG的前端,g ++和clang ++测试了你的代码,他们都正确地拒绝了代码。