如何转发声明名称空间std中的模板类?

#ifndef __TEST__ #define __TEST__ namespace std { template<typename T> class list; } template<typename T> void Pop(std::list<T> * l) { while(!l->empty()) l->pop(); } #endif 

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

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

问题不在于你不能转发声明一个模板类。 是的,你需要知道所有的模板参数和它们的默认值才能够正确地声明它:

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

但是为了在namespace std做出这样的前向声明,这个标准明确禁止了:你允许在std放置的唯一东西就是模板特化,通常在用户定义的types上是std::less 。 其他人可以在必要时引用相关文字。

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

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

我解决了这个问题。

我在C ++(Eclipse Juno)中实现了OSI图层(滑动窗口,2级)。 我有帧(模板<class T> )及其状态(状态模式,前向声明)。

解决scheme如下:

*.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){ 

还有另外一个class

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

有一个有限的select,你可以使用

标题:

 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()) {} [...] 

没有在真正的节目testing,所以期待它是不完美的。