我如何通过继承将模板参数传递到模板的子类

How do I deliver templates arguments to templated sub-class via inheritance?

本文关键字:子类 参数传递 继承 何通过      更新时间:2023-10-16

i具有此代码,该代码使用模板父类A,该类别具有一个模板的子类CA采用类型(T),C在其模板参数中采用该类型(T t)的对象。我要做的是,在类B的继承中,给C的模板参数,制作一个b对象,并调用C.h成员函数。但是我会遇到以下错误:

prog.cpp:10:44:错误:太多的模板参数列表
PROG.CPP:在功能'int main()'中:
PROG.CPP:14:5:错误:'B'在此范围中未声明
PROG.CPP:14:7:错误:预期';' 'b'

template <typename T> struct A {
    protected:
        template <T> struct C { 
            T h( T t ) { return t * t; }
        };
};
template <typename T = int> template <T t = 5> struct B : public A<T>::C<t> {};
int main() {
    B b;
    b.h();
}

当我实例化 B对象时,该错误被调用。我尝试改变了很多事情,但这并没有帮助。例如,我更改了:

template <typename T = int> template <T t = 5> struct B...

to

template <typename T = int> struct B...

和更改

: public A<T>::C<t> {};

to

: public A<T>::C<T t = 5> {};

,但我收到了更多错误:

prog.cpp:10:53:错误:非模板'C'用作模板
PROG.CPP:10:53:注意:使用'A<T>::template C'表示它是模板
prog.cpp:10:66:错误:预期的'{' ';' Token
PROG.CPP:在功能'int main()中:
PROG.CPP:14:7:错误:'b'之前缺少模板参数
prog.cpp:14:7:错误:预期的';' 'b'

我也对我得到B was not declared in this scope的第一组错误感到好奇。怎么可能?这是我定义B的方式吗?我会做什么错?

您必须对代码进行2个更改:

// First you don't need and should not use 2 templates
template <typename T = int, T t = 5> struct B
    // C++ doesn't know that A<T>::C is a template so you should say it here
    : public A<T>::template C<t> {};