#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(我认为是分配器)还有更多模板参数。但是,这是没有意义的。我是否必须知道模板类的完整模板声明才能转发声明它?

编辑:我以前没有使用过指针-这是一个引用。我将使用指针进行尝试。

最佳答案

问题不在于您不能向前声明模板类。是的,您确实需要了解所有模板参数及其默认值才能正确转发声明它:

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

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

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

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

关于c++ - 如何在命名空间std中转发声明模板类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3879162/

10-11 22:42
查看更多