如何从类模板自身的类定义中将其称为模板
How do I refer to a class template, as a template, from within its own class definition?
以下是场景:
template <template <typename> class T, typename V>
struct parent {
void do_something();
};
template <typename V>
struct child : public parent<child, V> {
void do_something(V argument);
using parent<child, V>::do_something; // C3200: invalid template argument for template parameter 'IMPL', expected a class template
};
上面的代码未能在给定的行上编译,并出现给定的错误(MSVC 9.0)。但是,如果我改为写这篇文章,则在child
:的类定义之外
template <typename V>
struct parent_identity_meta {
typedef typename parent<child, V> type; // no error!
};
我现在可以在child
中成功地完成以下操作:
using parent_identity_meta<V>::type::do_something;
我知道有一个限制(在C++11中得到了缓解),即不能对模板进行typedef,但我不认为这是我在这里遇到的问题,否则parent_identity_meta
中的typedef会失败。child
似乎指的是模板,而不是在其自己的类定义中,并且指的是从其内部生成的类。
这是可以理解的(每次都要写child<V>
会很痛苦);但有什么办法可以推翻这种行为吗?
这是C++03和C++11彼此不同的地方。本标准的相关部分为[temp.local]/1
。在C++03中,这表示:
与普通(非模板)类一样,类模板有一个注入的类名(子句9)。注入的类名可以与模板参数列表一起使用,也可以不使用。当它在没有模板参数列表的情况下使用时,它相当于插入的类名后面跟着<>中包含的类模板的模板参数。当它与模板参数列表一起使用时,它指的是指定的类模板专用化,可以是当前的专用化或另一个专用化。
这意味着child
(没有任何模板参数)引用了专门化child<V>
。在C++11中,它被更改为:
与普通(非模板)类一样,类模板有一个注入的类名(第9条)。注入的类名可以用作模板名或类型名。当它与模板参数列表一起使用,用作模板模板参数的模板参数,或用作友类模板声明的详细类型说明符中的最终标识符时,它指的是类模板本身。否则,它相当于模板名称后面跟着<>中包含的类模板的模板参数。
请特别注意When it is used ... as a template-argument for a template template-parameter ... it refers to the class template itself.
。这意味着在C++11中,您的代码是正确的。
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何定义一个纯抽象基类