#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/