朋友和模板类

时间:2010-08-10 12:03:49

标签: c++ templates

如何在不改变int数据状态的情况下编译以下代码?

template<typename U>
void Test(U);

template< class T > 
class B {
    int data;
    public:
    friend void Test<>( T );
};

template<typename U>
void Test(U u) {
    B < int> b1;
    b1.data = 7;
}

int main(int argc, char *argv[])
{
    char i;
    Test(i);
    system("PAUSE");    
    return 0;
}

上述代码导致编译器错误,因为b1.dataTest U = char中是私有的。

2 个答案:

答案 0 :(得分:1)

问题在于您正在与Test<U>成为B<U>的朋友(对于相同的U),但您正尝试从B<int>访问Test<char>的内部(不同的U)。

制作任何B的任何测试朋友可能是最简单的。

答案 1 :(得分:0)

这是使用VS2008编译的。不确定它是否符合标准。

#include <cstdlib>

template<typename U> void Test(U);

template< class T > class B {
    int data;
    public:
    template <typename U >  friend  void Test(U);
};

template<typename U>
void Test(U u){
    B < int> b1;
    b1.data = 7;
    }
int main(int argc, char *argv[])
{
    char i;
    Test(i);
    system("PAUSE");    
    return 0;
}