当前位置:  开发笔记 > 编程语言 > 正文

二进制运算符在模板类上重载

如何解决《二进制运算符在模板类上重载》经验,为你挑选了1个好方法。

我最近试图测量我的运算符重载/模板能力,并作为一个小测试,创建下面的Container类.虽然此代码编译良好并且在MSVC 2008(显示11)下正常工作,但MinGW/GCC和Comeau都会在operator+重载时阻塞.因为我比MSVC更信任他们,所以我想弄清楚我做错了什么.

这是代码:

#include 

using 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
  Container operator+ <> (Container& lhs, Container& rhs)
               ^

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

我很难让Comeau/MingGW去打球,所以我转向你们.很长一段时间以来,我的大脑在C++语法的重压下融化了这么多,所以我觉得有点尴尬;).

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



1> GRB..:

由于这个论坛发帖,我找到了解决方案.基本上,你需要有一个函数原型才能在类中使用'friend',但是你还需要声明这个类才能正确定义函数原型.因此,解决方案是在顶部有两个原型定义(功能和类).以下代码在所有三个编译器下编译:

#include 

using 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;
}

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有