正在转发模板参数
Forwarding template parameters
我正试图将模板参数转发到父类(来自子类(,但在尝试这样做时遇到了以下错误;
test.cc:9:46: error: type/value mismatch at argument 1 in template parameter list for ‘template<class A, class B> class BaseClass’
class SubClass : public BaseClass<SubClass, B> {
^
test.cc:9:46: error: expected a type, got ‘SubClass’
这是我试图运行的代码;
#include <cstdlib>
template<typename A, typename B>
class BaseClass {
};
template<typename B>
class SubClass : public BaseClass<SubClass, B> { // Trying to forward B to the second parameter
};
int main(void) {
return EXIT_SUCCESS;
}
我尝试过用typename
作为B
的前缀,但我得到了以下错误;
test.cc:9:55: error: type/value mismatch at argument 1 in template parameter list for ‘template<class A, class B> class BaseClass’
class SubClass : public BaseClass<SubClass, typename B> {
^
test.cc:9:55: error: expected a type, got ‘SubClass’
test.cc:9:55: error: template argument 2 is invalid
template<typename B>
class SubClass : public BaseClass<SubClass<B>, B>
// ^^^
{
};
SubClass
是注入的名称,只能在SubClass
的范围内用于引用SubClass<B>
。在外部,它是类模板本身的名称(它需要模板参数列表<>
来形成类型(。
§9【类别】/p2:
类名也插入到类本身的作用域中;这被称为注入的类名。
§3.3.2[基本范围.pdecl]/p8:
注入类名(第9条(的声明点紧跟在类定义。
§14.6.1【本地温度】/p1:
与普通(非模板(类一样,类模板有一个注入的类名(第9条(。注入的类名可以用作模板名或类型名。当它与模板参数列表一起使用时,作为模板模板参数的模版参数,或者作为友元类模板声明的精化类型说明符中的最终标识符,它引用类模板本身。否则,它是等效的到
<>
中包含的类模板的模板参数。
您正在尝试使用注入的类名。然而,
类名也插入到类本身的作用域中;这被称为注入的类名。
base子句没有查找类范围内的名称。因此,你必须自己提供论据列表。
template<typename B>
class SubClass : public BaseClass<SubClass<B>, B> { /*..*/ };
相关文章:
- 是否可以在不扣除的情况下将模板参数转发到 make_*?
- 可变参数模板参数转发使用逗号运算符
- 如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?
- 将可变参数函数参数转发到 std::function 对象
- 我如何实现变异模式以将可变数量的参数转发到C 11中的函数
- 无临时实例的参数转发
- 如何将构造函数参数转发到 boost::optional
- 如何使包装类将其构造函数参数转发到 std::vector 的构造函数?
- 如何将 CMake 参数转发到外部项目
- 使用std::forward而不是将参数转发到另一个函数
- 使用declard和参数转发构造函数隐式复制结构
- 将可变参数模板参数转发到多个类成员
- Template()的参数转发使构造函数参数变为常量
- 我怎样才能完美地将参数转发到 STL 集合
- 如何在 C++11 中使用可变参数模板正确创建显式参数转发函数
- 使用默认参数转发引用
- 将可变模板参数转发到类似printf的函数
- static_cast的参数转发
- Boost.Program_options:将"--"后面的参数转发到另一个程序
- 将参数转发给模板成员函数