在C++中声明一个类模板作为类模板的朋友

问题描述:

我试图将类模板声明为另一个类模板的朋友,所以一个类中的私有成员可以被另一个类访问。 比如我有两个类,如下所示:在C++中声明一个类模板作为类模板的朋友

A.h 
template <typename T> 
class A { 
    private: 
     T content; 
} 

B.h 
#include "A.h" 
template <typename T> 
class B { 
    public: 
     void add(T); 

    private: 
     A<T>* ptr; 
} 

现在,我想使B类< T> A级< T>的朋友,所以我可以有通过B类< T>的功能添加访问A类< T>的内容。所以,我添加了几行A.H:

A.h 
template <typename T> class B; 
template <typename T> 
class A { 
    friend class B<T>; 
    ... 

我使用Visual Studio和上面的代码会给我“解析外部符号...”(出错代码LNK2019)。 我试过其他的变化,但我不断收到链接错误。请帮助我。谢谢。

函数add(T)的定义在B.cpp中,我没有在帖子中写过。

+0

如果你得到一个链接错误,那么编译成功,你的'朋友'声明正常工作。这是一条红鲱鱼。 – Quentin

+0

对不起,我不知道这两个是不同的。 – HelperKing

+1

'B :: add()'的定义(执行)在哪里?如果链接中没有链接,则会解释链接器错误。 – Peter

以下代码可以在gcc上正常生成。我添加了B<T>::add(T)的定义,因为它不见了。这很可能是因为缺席导致你的link - not compilation! - error

template<typename T> 
class B; 

template <typename T> 
class A { 
    private: 
     T content; 

    friend B<T>; 
}; 

template <typename T> 
class B { 
    public: 
     void add(T t) { A<T> a; a.content = t; } 

    private: 
     A<T>* ptr; 
}; 

int main() { 
    A<int> a; 
    B<int> b; 
    b.add(3); 
} 
+0

我刚刚测试过,当它在一个文件中时,你的代码工作正常。但是,我想要做的是为每个类实现一个单独的头文件。你能告诉我该怎么办?谢谢。 – HelperKing

+1

因为它是模板代码,所以一般来说,如果声明在头文件中,那么应该是实现(不要将模板代码的一部分放在'.cpp'文件中)。这是你的问题吗? –

+0

这就是正确的位置。当我把所有内容都放在头文件中时,它会完美地编译。我对这些文件类型的理解很差。非常感谢。你能否简要解释为什么把函数的实现放在一个单独的.cpp文件中不起作用? – HelperKing