在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中,我没有在帖子中写过。
以下代码可以在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);
}
我刚刚测试过,当它在一个文件中时,你的代码工作正常。但是,我想要做的是为每个类实现一个单独的头文件。你能告诉我该怎么办?谢谢。 – HelperKing
因为它是模板代码,所以一般来说,如果声明在头文件中,那么应该是实现(不要将模板代码的一部分放在'.cpp'文件中)。这是你的问题吗? –
这就是正确的位置。当我把所有内容都放在头文件中时,它会完美地编译。我对这些文件类型的理解很差。非常感谢。你能否简要解释为什么把函数的实现放在一个单独的.cpp文件中不起作用? – HelperKing
如果你得到一个链接错误,那么编译成功,你的'朋友'声明正常工作。这是一条红鲱鱼。 – Quentin
对不起,我不知道这两个是不同的。 – HelperKing
'B :: add()'的定义(执行)在哪里?如果链接中没有链接,则会解释链接器错误。 –
Peter