【问题标题】:Declaring a class template as a friend of a class template in C++在 C++ 中将类模板声明为类模板的朋友
【发布时间】:2017-02-09 03:07:36
【问题描述】:

我试图将一个类模板声明为另一个类模板的朋友,这样一个类中的私有成员可以被另一个类访问。 例如我有两个类如下:

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类成为A类的朋友,这样我就可以通过B类的函数add来访问A类的内容了。所以,我在 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 中,我没有在帖子中写。

【问题讨论】:

  • 如果你得到一个链接器错误,那么编译成功,你的friend声明工作正常。这是一条红鲱鱼。
  • 很抱歉,我不知道这两个是不同的。
  • B&lt;T&gt;::add()的定义(实现)在哪里?如果链接中没有,则说明链接器错误。

标签: c++ class templates friend


【解决方案1】:

以下代码在 gcc 上构建良好。我添加了B&lt;T&gt;::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);
}

【讨论】:

  • 我也刚测试过,您的代码在一个文件中时运行良好。但是,我想做的是为每个类实现一个单独的头文件。你能告诉我怎么做吗?谢谢。
  • 既然是模板代码,那么一般来说,如果声明在头文件中,那么实现也应该如此(不要将部分模板代码放在.cpp文件中)。这是你的问题吗?
  • 恰到好处。当我将所有内容都放在头文件中时,它编译得很好。我对这些文件类型的理解很差是原因。太感谢了。您能否简要解释一下为什么将函数的实现放在单独的 .cpp 文件中不起作用?
  • @RuntimeError 见this question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多