How to forward declare a template class in namespace 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

and used that function in my main. I get errors. Of course, I know that there are more template params for std::list (allocator I think). But, that is beside the point. Do I have to know the full template declaration of a template class to be able to forward declare it?

EDIT: I wasn't using a pointer before - it was a reference. I'll try it out with the pointer.

141597 次浏览

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

问题不在于您不能转发-声明一个模板类。是的,您需要知道所有的模板参数 以及他们的违约,以便能够正确地转发-声明它:

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

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

只要 #include <list>,别担心。

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

我解决了那个问题。

我在 C + + (Eclipse Juno)中为网络模拟实现 OSI 层(滑动窗口,Level 2)。我有帧(模板 <class T>)和它的状态(状态模式,前向声明)。

解决办法如下:

*.cpp文件中,必须包含转发的 Header 文件,即。

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

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