2010-10-07 141 views
114
​​

并在我的主要使用该功能。我收到错误。当然,我知道std::list(我认为是分配器)有更多的模板参数。但是,这是重要的。我是否必须知道模板类的完整模板声明才能够转发声明它?如何在名称空间std中转发声明模板类?

编辑:我以前没有使用指针 - 这是一个参考。我会用指针试一试。

+0

而在列表的情况下,第二个参数是一个默认参数,它是'std :: allocator ' – nakiya 2010-10-07 06:42:08

+2

可以认为它是一个疏忽,STL不包含前向声明头。另一方面,它的文件经常包含在编译时间内可能不会带来任何好处... – 2010-10-07 07:02:40

+6

'__TEST__'是一个保留的标识符,[不要使用它](http://stackoverflow.com /问题/ 228783 /什么,是最规则有关,使用-的下划线,在-AC-标识符)。 – GManNickG 2010-10-07 08:41:50

回答

116

问题不在于您无法转发声明模板类。是的,你需要知道所有的模板参数及其缺省值,才能够正确转发,它声明:

namespace std { 
    template<class T, class Allocator = std::allocator<T>> 
    class list; 
} 

但是,为了使即使是这样在namespace std向前声明明确标准禁止:只有你允许放入的东西std是一个模板专业,通常是std::less在用户定义的类型。如有必要,其他人可以引用相关文本。

只需#include <list>,不用担心。

哦,顺便说一句,任何包含双下划线的名字都会被保留供实现使用,所以您应该使用类似TEST_H而不是__TEST__。它不会生成警告或错误,但是如果程序与实现定义的标识符发生冲突,则不能保证编译或运行正确:它是不合格的。还禁止使用以下划线开头的名称,后面跟着大写字母等等。一般来说,除非你知道你在处理什么魔法,否则不要用下划线开始。

+0

感谢您的提示! – nakiya 2010-10-07 06:44:48

+3

为什么禁止在'namespace std'中转发声明的东西? – nakiya 2010-10-07 06:46:06

+4

看看这个答案(http://stackoverflow.com/questions/307343/forward-declare-an-stl-container/307408#307408)和链接的新闻组讨论。 – 2010-10-07 06:49:30

9

前向声明应该指定完整的模板参数列表。

20

我解决了这个问题。

我正在为C++(Eclipse Juno)中的网络仿真实施OSI层(滑块窗口,2级)。我有帧(模板<class T>)及其状态(状态模式,前向声明)。

该解决方案如下:

*.cpp文件中,必须包含头文件,你前进,即

ifndef STATE_H_ 
#define STATE_H_ 
#include <stdlib.h> 
#include "Frame.h" 

template <class T> 
class LinkFrame; 

using namespace std; 

template <class T> 
class State { 

    protected: 
    LinkFrame<int> *myFrame; 

} 

其CPP:

#include "State.h" 
#include "Frame.h" 
#include "LinkFrame.h" 

template <class T> 
bool State<T>::replace(Frame<T> *f){ 

而且...另一班。

+18

在头文件中放置任何'使用名称空间'是一种非常糟糕的做法,因为它会阻止任何使用该头文件的人能够使用否则会有效的本地名称。它基本上击败了命名空间的整个点。 – 2016-02-23 06:37:59

-4

有你可以用有限的替代

头:

class std_int_vector; 

class A{ 
    std_int_vector* vector; 
public: 
    A(); 
    virtual ~A(); 
}; 

CPP:

#include "header.h" 
#include <vector> 
class std_int_vector: public std::vectror<int> {} 

A::A() : vector(new std_int_vector()) {} 
[...] 

在实际程序没有经过测试,所以希望它是不完美的。