如何转发声明名称空间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,所以期待它是不完美的。