正在转发模板参数

Forwarding template parameters

本文关键字:参数 转发      更新时间:2023-10-16

我正试图将模板参数转发到父类(来自子类(,但在尝试这样做时遇到了以下错误;

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> { /*..*/ };