我最近试图评估运算符(operator)的重载/模板能力,并作为一个小测试,在下面创建了Container类。尽管此代码可以很好地编译并且可以在MSVC 2008下正常工作(显示11),但MinGW/GCC和Comeau都因operator+重载而阻塞。因为我比MSVC更信任他们,所以我试图找出我做错了什么。

这是代码:

#include <iostream>

using namespace std;

template <typename T>
class Container
{
      friend Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs);
   public: void setobj(T ob);
     T getobj();
      private: T obj;
};

template <typename T>
void Container<T>::setobj(T ob)
{
   obj = ob;
}

template <typename T>
T Container<T>::getobj()
{
   return obj;
}

template <typename T>
Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs)
{
      Container<T> temp;
      temp.obj = lhs.obj + rhs.obj;
      return temp;
}

int main()
{
    Container<int> a, b;

 a.setobj(5);
    b.setobj(6);

 Container<int> c = a + b;

 cout << c.getobj() << endl;

    return 0;
}

这是Comeau给出的错误:
Comeau C/C++ 4.3.10.1 (Oct  6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing.  All rights reserved.
MODE:strict errors C++ C++0x_extensions

"ComeauTest.c", line 27: error: an explicit template argument list is not allowed
          on this declaration
  Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs)
               ^

1 error detected in the compilation of "ComeauTest.c".

我很难让Comeau/MingGW打球,所以我来找你们。自从我的大脑在C++语法的作用下融化了这么长时间以来,我感到有点尴尬;)。

编辑:消除了初始Comeau转储中列出的(不相关)左值错误。

最佳答案

我找到了解决方案to this forum posting。本质上,您需要具有函数原型(prototype),然后才能在类中对其使用“ friend ”,但是还需要声明该类,以正确定义函数原型(prototype)。因此,解决方案是在顶部具有两个原型(prototype)定义(函数和类)。以下代码在所有三个编译器下进行编译:

#include <iostream>

using namespace std;

//added lines below
template<typename T> class Container;
template<typename T> Container<T> operator+ (Container<T>& lhs, Container<T>& rhs);

template <typename T>
class Container
{
      friend Container<T> operator+ <> (Container<T>& lhs, Container<T>& rhs);
      public: void setobj(T ob);
              T getobj();
      private: T obj;
};

template <typename T>
void Container<T>::setobj(T ob)
{
      obj = ob;
}

template <typename T>
T Container<T>::getobj()
{
      return obj;
}

template <typename T>
Container<T> operator+ (Container<T>& lhs, Container<T>& rhs)
{
      Container<T> temp;
      temp.obj = lhs.obj + rhs.obj;
      return temp;
}

int main()
{
    Container<int> a, b;

    a.setobj(5);
    b.setobj(6);

    Container<int> c = a + b;

    cout << c.getobj() << endl;

    return 0;
}

关于c++ - 模板类上的二进制运算符重载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/962599/

10-11 16:03