LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1711|回复: 5

c++模板类中怎么重载operator<<

[复制链接]
发表于 2005-12-18 15:47:56 | 显示全部楼层 |阅读模式
如题,我看的书上面没讲..我按自己的想法写了一个,结果编译不通过...
有人知道吗? thx
发表于 2005-12-18 22:41:15 | 显示全部楼层
模板类里重载operator<<?不太明白和普通类有什么区别?
而且operator<<作为成员存在没什么意义,一般作为全域函数,或者某类的friend。
回复 支持 反对

使用道具 举报

发表于 2005-12-19 12:00:51 | 显示全部楼层
Post by rushrush
如题,我看的书上面没讲..我按自己的想法写了一个,结果编译不通过...
有人知道吗? thx


如果有可能,把你的代码帖出来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-19 12:37:48 | 显示全部楼层
呃,是我没说清楚.是作为模板类的友员.
[PHP]
//testTempClass.h

#include <iostream>
using namespace std;

#ifndef H_testTempClass
#define H_testTempClass

template<class Type>
class testClass
{
        friend ostream& operator<<
                (ostream& osObj, const testClass<Type> &rightObj);
public:
        void setData(Type elem);
private:
        Type a;
};

template <class Type>
ostream& ostream& operator<<
                (ostream& osObj, const testClass<Type> &rightObj)
        //原来的testClass后面没有<Type>
{
        osObj<<rightObj.a;
        return osObj;
}

template <class Type>
void testClass<Type>::setData(Type elem)
{
        a = elem;
}

#endif

//main.cpp

#include "testTempClass.h"

int main()
{
        testClass<int> intObj;
        intObj.setData(2);
        cout<<intObj;
        cout<<endl;

        return 0;
}
[/PHP]

  1. $ g++ -o test main.cpp
  2. In file included from main.cpp:3:
  3. testTempClass.h:13: warning: friend declaration `std::ostream&
  4.    operator<<(std::ostream&, const testClass<Type>&)' declares a non-template
  5.    function
  6. testTempClass.h:13: warning: (if this is not what you intended, make sure the
  7.    function template has already been declared and add <> after the function
  8.    name here) -Wno-non-template-friend disables this warning
  9. testTempClass.h:21: error: syntax error before `&' token
  10. testTempClass.h:22: error: `Type' was not declared in this scope
  11. testTempClass.h:22: error: template argument 1 is invalid
  12. testTempClass.h:24: error: ISO C++ forbids declaration of `operator<<' with no
  13.    type
  14. testTempClass.h:24: error: ISO C++ forbids declaration of `rightObj' with no
  15.    type
  16. testTempClass.h: In function `int& operator<<(std::ostream&, const int&)':
  17. testTempClass.h:25: error: request for member `a' in `rightObj', which is of
  18.    non-class type `const int'
  19. testTempClass.h:26: error: invalid initialization of reference of type 'int&'
  20.    from expression of type 'std::basic_ostream<char, std::char_traits<char> >'
复制代码


还是错误,呵呵. 请大家多多指教..
回复 支持 反对

使用道具 举报

发表于 2005-12-19 13:31:54 | 显示全部楼层
呃,有点小问题,
[PHP]
//testTempClass.h

#include <iostream>
using namespace std;

#ifndef H_testTempClass
#define H_testTempClass

template<class Type>
class testClass
{
        friend ostream& operator<<
                (ostream& osObj, const testClass<Type> &rightObj);
[/php]
应该为:

  1. template <typename T>
  2. friend ostream& operator<<(ostream& osObj, const testClass<T> &rightObj);
复制代码


下面是笔误:
[php]
template <class Type>
ostream& ostream& operator<<
                (ostream& osObj, const testClass<Type> &rightObj)
        //原来的testClass后面没有<Type>
{
        osObj<<rightObj.a;
        return osObj;
}
[/php]
返回类型处多了一个ostream&
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-19 14:01:05 | 显示全部楼层
编译成功
谢谢rickxbx
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表