回 帖 发 新 帖 刷新版面

主题:C++友元模板 2

为什么下面的代码会提示出错啊!!!
我感觉提示的错误在friend A<T>& operator* <T>(T k, A<T>& a);
但我觉得这句话没有错的啊.
====================================================
#include <iostream>

using namespace std;

template<class T>
class A
{
    friend ostream& operator<< <T>(ostream &os, const A<T>& a);
    friend A<T>& operator* <T>(T k, A<T>& a);
public:
    A()
    {
        i=3;
    }
    int i;
};
template<class T>
ostream& operator<<(ostream &os, const A<T>& a)
{
    os<<a.i<<endl;
    return os;
};
template<class T>
A<T>& operator*(T k, A<T>& a)
{
    return a;
};

int main()
{
    A<int> a;
    cout<<3*a;
    return 0;
}

回复列表 (共4个回复)

沙发

跟你的上一个问题是一模一样的,所以解决方法也是一模一样的

#include <iostream>
using namespace std;

template<class T> class A;
template<class T> ostream& operator<<( ostream &os, const A<T>& a );
template<class T> A<T>& operator*( T k, A<T>& a );

template<class T>
class A
{
    friend ostream& operator<< <T>( ostream &os, const A<T>& a );
    friend A<T>& operator* <T>( T k, A<T>& a );
public:
    A() : i(3)
    {
    }
    int i;
};

template<class T>
ostream& operator<<( ostream &os, const A<T>& a )
{
    os << a.i;
    return os;
};

template<class T>
A<T>& operator*( T k, A<T>& a )
{
    return a;
};

int main()
{
    A<int> a;
    cout << 3*a << endl;
    return 0;
}

板凳

这个问题有点奇怪,
为什么一定要先声明这三句话呢???
template<class T> class A;
template<class T> ostream& operator<<( ostream &os, const A<T>& a );
template<class T> A<T>& operator*( T k, A<T>& a );

而之前的那段代码没有声明也可以运行啊...
之前的代码:
#include <iostream>

using namespace std;

template<class T>
class A
{
    friend ostream& operator<< <T>(ostream &os, const A<T>& a);
public:
    A()
    {
        i=3;
    }
    int i;
};
template<class T>
ostream& operator<<(ostream &os, const A<T>& a)
{
    os<<a.i<<endl;
    return os;
};
int main()
{
    A<int> a;
    cout<<a;
    return 0;
}

3 楼

为什么一定要先声明这三句话呢???
----- 很显然的,class A中要friend一个模板函数的实例,那么就必须让编译器知道这是个模板,而这个模板原型中又含有class A,所以class A也要预先声明。

而之前的那段代码没有声明也可以运行啊...
----- 你这个问题我没法回答你,我只按照标准C++语法来写代码,为什么某个编译器能编译通过一段不应该编译通过的代码我不关心,我只关心这个编译器能不能编译通过应该能编译通过的代码。

4 楼

哦,哈哈,谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册