我最近试图测量我的运算符重载/模板能力,并作为一个小测试,创建下面的Container类.虽然此代码编译良好并且在MSVC 2008(显示11)下正常工作,但MinGW/GCC和Comeau都会在operator+
重载时阻塞.因为我比MSVC更信任他们,所以我想弄清楚我做错了什么.
这是代码:
#includeusing namespace std; template class Container { friend Container operator+ <> (Container & lhs, Container & rhs); public: void setobj(T ob); T getobj(); private: T obj; }; template void Container ::setobj(T ob) { obj = ob; } template T Container ::getobj() { return obj; } template Container operator+ <> (Container & lhs, Container & rhs) { Container temp; temp.obj = lhs.obj + rhs.obj; return temp; } int main() { Container a, b; a.setobj(5); b.setobj(6); Container 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 Containeroperator+ <> (Container & lhs, Container & rhs) ^ 1 error detected in the compilation of "ComeauTest.c".
我很难让Comeau/MingGW去打球,所以我转向你们.很长一段时间以来,我的大脑在C++语法的重压下融化了这么多,所以我觉得有点尴尬;).
编辑:消除了初始Comeau转储中列出的(不相关的)左值错误.
由于这个论坛发帖,我找到了解决方案.基本上,你需要有一个函数原型才能在类中使用'friend',但是你还需要声明这个类才能正确定义函数原型.因此,解决方案是在顶部有两个原型定义(功能和类).以下代码在所有三个编译器下编译:
#includeusing namespace std; //added lines below template class Container; template Container operator+ (Container & lhs, Container & rhs); template class Container { friend Container operator+ <> (Container & lhs, Container & rhs); public: void setobj(T ob); T getobj(); private: T obj; }; template void Container ::setobj(T ob) { obj = ob; } template T Container ::getobj() { return obj; } template Container operator+ (Container & lhs, Container & rhs) { Container temp; temp.obj = lhs.obj + rhs.obj; return temp; } int main() { Container a, b; a.setobj(5); b.setobj(6); Container c = a + b; cout << c.getobj() << endl; return 0; }