如何转发声明一个模板类? [英] How to forward declare a template class?

查看:171
本文介绍了如何转发声明一个模板类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#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 (allocator我想)。但是,这是旁边的点。我必须知道模板类的完整模板声明才能转发声明吗?

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;
}

但是要在命名空间中做一个向前声明std 是明确禁止的标准:只有你允许放在 std em> specialization ,通常在用户定义类型 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.

这篇关于如何转发声明一个模板类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆