Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在.h文件中转发声明以使用友好类 模板 类链接; 模板 类节点{ ... 朋友类链接; }; 模板 类链接{ ... };_C++_Linked List_Forward Declaration - Fatal编程技术网

C++ 在.h文件中转发声明以使用友好类 模板 类链接; 模板 类节点{ ... 朋友类链接; }; 模板 类链接{ ... };

C++ 在.h文件中转发声明以使用友好类 模板 类链接; 模板 类节点{ ... 朋友类链接; }; 模板 类链接{ ... };,c++,linked-list,forward-declaration,C++,Linked List,Forward Declaration,请注意,我已经向前声明了链接类,以便将其声明为节点的友好类,但现在我想为每个类创建一个不同的.h和.cpp文件。我将如何在它们中进行转发声明 < P>你应该考虑在.h文件中拥有模板的全部声明。 如果需要将它们分开,您可以: h: template <typename T> class linked; template <typename T> class node { ... friend class linked<T>; }; temp

请注意,我已经向前声明了链接类,以便将其声明为节点的友好类,但现在我想为每个类创建一个不同的.h和.cpp文件。我将如何在它们中进行转发声明

< P>你应该考虑在.h文件中拥有模板的全部声明。

如果需要将它们分开,您可以:

h:

template <typename T>
class linked;

template <typename T>
class node {
    ...
    friend class linked<T>; 
};

template <typename T>
class linked {
    ...
};
模板
类链接;
#包括“linked_implementation.tpp”
链接的_implementation.tpp:

template <typename T>
class linked;
#include "linked_implementation.tpp"
\ifndef链接的\u实施\u TPP
#定义链接的\u实施\u TPP
模板
类节点{
...
朋友类链接;
};
模板
类链接{
...
};
#恩迪夫
根据注释编辑

node.hpp

#ifndef LINKED_IMPLEMENTATION_TPP
#define LINKED_IMPLEMENTATION_TPP

template <typename T>
class node {
    ...
    friend class linked<T>; 
};

template <typename T>
class linked {
    ...
};

#endif
#pragma一次
模板类链接;
模板类节点{
... 
朋友类链接;
};
linked.hpp

#pragma once

template <typename T> class linked; 
template <typename T> class node { 
... 
friend class linked<T>; 
};
#pragma once

template <typename T> class node { 
... 
class linked; 
friend class linked<T>; 
};
#pragma一次
#包括“node.hpp”//只是因为我想您将在链接实现中使用它
模板类链接{
... 
};
因此,您可以在不包含linked.hpp的情况下继续使用节点。您甚至可以将其保留为私有标题,而不发送给用户。但是,如果某些代码想要使用linked类,只需包含linked.hpp

编辑 作为一种选择 node.hpp

#pragma一次
模板类节点{
... 
类链接;
朋友类链接;
};
linked.hpp

#pragma once

template <typename T> class linked; 
template <typename T> class node { 
... 
friend class linked<T>; 
};
#pragma once

template <typename T> class node { 
... 
class linked; 
friend class linked<T>; 
};
#pragma一次
#包括“node.hpp”
模板类节点::链接{
... 
};

为这些模板类创建.cpp文件没有意义。(除非你显式地实例化你需要的每个实例化,这不是一个好主意),因为使用它们的人需要知道模板类成员的定义才能实例化它们。如果我是你,我会将
节点声明为一个结构,并将其所有成员公开。您真的不需要访问控制,因为它只是一个方便的对象。@RamSharma它要求您做一些不起作用的事情?您可以像以前一样向前声明。这里需要一个转发声明,否则会出现循环include错误。也就是说,
node
应该是linked的成员结构,因为它们是紧密耦合的<代码>节点
不是类。这是一个模板。确切地说,它是一个类模板。它不是一个“模板类”。规则是模板(类模板和函数模板一样)放在头文件中。关于类定义的规则不适用于非类的事物。您还应该声明它们需要确保
链接的\u实现。cpp
不会作为要编译的文件添加到项目中。@NathanOliver编译
链接的\u实现。cpp
除了做不必要的工作之外还有什么缺点吗?我会避免使用
cpp
扩展完全是由于@NathanOliver提到的原因。一些IDE会自动构建所有
cpp
文件,在这种情况下会中断。大多数人将
tpp
hpp
用于类模板实现。@NathanOliver我想,如果我错了,请纠正我,如果将linked_implementation.cpp添加到项目中,它会编译得很好,“只是”编译过程中的开销process@Roberto没问题。还要注意,
linked.h
需要包含防护装置,否则您将有一个无限循环包含。或者您可以从
linked\u implementation.tpp
中删除
#include“linked.h”
,因为它永远不会自己编译。