LinuxSir.cn,穿越时空的Linuxsir!

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

C++类模板的友元函数模板问题

[复制链接]
发表于 2006-9-5 21:37:56 | 显示全部楼层 |阅读模式
在类模板中声明一友元函数模板,结果编译无法通过。 想破头也不明白哪里错了。
哪位C++高手帮忙一下!

[php]

// file : b3.cc

#include <iostream>
using namespace std;

template<typename T> class A;

template<typename T>
A<T> operator+(A<T> const& rhs1, A<T> const& rhs2)
{
    A<T> ret(rhs1.data+rhs2.data);
    return ret;
}

template<typename T>
class A{
friend A<T> operator+ <T>(A<T> const&, A<T> const&);
private:
    T data;
public:
    A(T const& x):data(x){}
    void show() const { cout<<data<<endl; }
};


int main()
{
    A<int> a(9);
    A<int> b(8);
    A<int> c=a+b;
    c.show();
}
[/php]

$ gcc -v
使用内建 specs。
目标:i686-pc-linux-gnu
配置为:/var/tmp/portage/gcc-4.1.1-r1/work/gcc-4.1.1/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/4.1.1 --includedir=/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include --datadir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1 --mandir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man --infodir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/info --with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/g++-v4 --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --disable-libunwind-exceptions --disable-multilib --disable-libmudflap --disable-libssp --disable-libgcj --enable-languages=c,c++,fortran --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu
线程模型:posix
gcc 版本 4.1.1 (Gentoo 4.1.1-r1)

$ g++ b3.cc
/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/g++-v4/bits/stl_iterator_base_types.h: In instantiation of ‘std::iterator_traits<int>’:
/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/g++-v4/bits/stl_iterator.h:98:   instantiated from ‘std::reverse_iterator<int>’
b3.cc:15:   instantiated from ‘A<int>’
b3.cc:26:   instantiated from here
/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/g++-v4/bits/stl_iterator_base_types.h:129: 错误:‘int’ 不是类、 结构或联合类型
/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/g++-v4/bits/stl_iterator_base_types.h:130: 错误:‘int’ 不是类、 结构或联合类型
/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/g++-v4/bits/stl_iterator_base_types.h:131: 错误:‘int’ 不是类、 结构或联合类型
/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/g++-v4/bits/stl_iterator_base_types.h:132: 错误:‘int’ 不是类、 结构或联合类型
/usr/lib/gcc/i686-pc-linux-gnu/4.1.1/include/g++-v4/bits/stl_iterator_base_types.h:133: 错误:‘int’ 不是类、 结构或联合类型
 楼主| 发表于 2006-9-5 21:53:49 | 显示全部楼层
[php]
template<typename T>
class A{

private:
    T data;
public:
    template<typename Type> friend A<Type> operator+(A<Type> const&, A<Type> const&);
    A(T const& x):data(x){}
    void show() const { cout<<data<<endl; }
};
[/php]
如果采用非绑定(一对多)声明友元操作符函数模板,就可以通过编译。记得标准里头允许友元模板操作符函数的绑定式(一对一:即类实例化和函数实例化是一一映射关系)啊。。。 对于一般性的非操作符函数也实验了可以绑定式声明的。。。。真是怪了,莫非gcc还未实现?
回复 支持 反对

使用道具 举报

发表于 2006-9-5 21:57:04 | 显示全部楼层
  1. // file : b3.cc
  2. #include <iostream>
  3. using namespace std;
  4. template<typename T> class A;
  5. template<typename T>
  6. A<T> operator+(A<T> const& rhs1, A<T> const& rhs2)
  7. {
  8.     A<T> ret(rhs1.data+rhs2.data);
  9.     return ret;
  10. }
  11. template<typename T>
  12. class A{
  13.     friend A<T> operator+ <>(A<T> const&, A<T> const&);  [color=red]// 把operator+后面<>的T去掉[/color]
  14. private:
  15.     T data;
  16. public:
  17.     A(T const& x):data(x){}
  18.     void show() const { cout<<data<<endl; }
  19. };
  20. int main()
  21. {
  22.     A<int> a(9);
  23.     A<int> b(8);
  24.     A<int> c=a+b;
  25.     c.show();
  26. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-5 22:00:38 | 显示全部楼层
Post by manphiz



  1. template<typename T>
  2. class A{
  3.     friend A<T> operator+ <>(A<T> const&, A<T> const&);  [color=red]// 把operator+后面<>的T去掉[/color]
  4. private:
  5.     T data;
  6. public:
  7.     A(T const& x):data(x){}
  8.     void show() const { cout<<data<<endl; }
  9. };

复制代码


果然如此,这可怪了;  这规定是哪里来的?
回复 支持 反对

使用道具 举报

发表于 2006-9-5 22:06:59 | 显示全部楼层
个人感觉gcc实现的问题。有待进一步考证……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-5 22:16:33 | 显示全部楼层
看来是gcc的问题。  vs.net2005 在 有模板参数和 无模板参数时都可以通过编译和运行。
回复 支持 反对

使用道具 举报

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

本版积分规则

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