如何转发在命名空间std中声明模板类?

时间:2010-10-07 06:20:17

标签: c++ templates g++

#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

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

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

4 个答案:

答案 0 :(得分:138)

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

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

但是,要在namespace std中进行这样的前瞻性声明,标准明确禁止:允许您放入std的内容是模板< em> specialization ,通常是std::less用户定义的类型。如有必要,其他人可以引用相关文本。

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

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

答案 1 :(得分: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){

而且......另一堂课。

答案 2 :(得分:10)

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

答案 3 :(得分:-5)

您可以使用有限的替代方案

头:

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

没有在真实节目中测试过,所以期望它不完美。

相关问题