如何在命名空间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
并在我的主要功能中使用了该功能.我得到错误.当然,我知道 std::list
有更多的模板参数(我认为是分配器).但是,这不是重点.我是否必须知道模板类的完整模板声明才能转发声明它?
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?
我之前没有使用指针 - 它是一个参考.我用指针试试看.
I wasn't using a pointer before - it was a reference. I'll try it out with the pointer.
推荐答案
问题不在于不能前向声明模板类.是的,您确实需要知道所有模板参数及其默认值才能正确前向声明它:
The problem is not that you can't forward-declare a template class. Yes, you do need to know all of the template parameters and their defaults to be able to forward-declare it correctly:
namespace std {
template<class T, class Allocator = std::allocator<T>>
class list;
}
但是,即使在 namespace std
中进行这样的前向声明,标准也明确禁止:only 允许您放入 std
是一个模板specialisation,通常是用户定义类型的std::less
.如有必要,其他人可以引用相关文字.
But to make even such a forward declaration in namespace std
is explicitly prohibited by the standard: the only thing you're allowed to put in std
is a template specialisation, commonly std::less
on a user-defined type. Someone else can cite the relevant text if necessary.
只需#include <list>
,不用担心.
哦,顺便说一句,任何包含双下划线的名称都保留供实现使用,因此您应该使用 TEST_H
之类的名称,而不是 __TEST__
.它不会产生警告或错误,但如果您的程序与实现定义的标识符发生冲突,则不能保证正确编译或运行:它是格式错误的.除其他外,还禁止以下划线后跟大写字母开头的名称.一般来说,除非你知道你在处理什么魔法,否则不要用下划线开头.
Oh, incidentally, any name containing double-underscores is reserved for use by the implementation, so you should use something like TEST_H
instead of __TEST__
. It's not going to generate a warning or an error, but if your program has a clash with an implementation-defined identifier, then it's not guaranteed to compile or run correctly: it's ill-formed. Also prohibited are names beginning with an underscore followed by a capital letter, among others. In general, don't start things with underscores unless you know what magic you're dealing with.
相关文章