为什么C ++要求我在初始化列表中重复基类的模板参数?

无意义

我正在将一些代码从MSVC(没有permissive-)移植到linux,并且了解到,如果您在类的初始化程序列表中调用模板基类的构造函数,则必须指定所有模板参数,否则会出错。似乎有点多余,因为如果您在重新输入模板参数时犯了一个错误,那就是一个硬错误:

错误:类型“ Base <int,true>”不是“派生”的直接或虚拟基础

完整的代码在这里:

template <typename T, bool has_x>
struct Base
{
    Base(T t): t_(t){
    }
    T t_=0;
};



template <typename T>
class Derived : public Base<T, false>
{
public:
    // : Base<T, true> is hard error
    Derived(const T& t) : Base<T, false>(t) {}
};

int main()
{
    Derived d(47);
}

是否有很强的理由,或者只是标准化过程从未花时间处理这种用例的特殊情况?

黑猫

您只需在Derived模板为且基础类型取决于模板参数的情况下执行此操作。

例如,它将编译:

template <typename T>
class Derived : public Base<int, false>
{
public:
    Derived(const T& t) : Base(t) {}
};

据我所知,这里(在成员初始值设定项列表中)Base实际上是的注入类名称Base<...>,它像其他所有内容一样从其继承。

并且,如果基类的类型确实取决于模板参数,则其继承的注入类名称将变得不可访问(至少直接访问),就像从基类继承的任何其他成员一样。

对于成员变量/函数,您需要添加对其this->进行访问,但是对于类型成员,则需要Derived::

template <typename T>
class Derived : public Base<T, false>
{
public:
    Derived(const T& t) : Derived::Base(t) {}
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#在类中初始化静态列表

来自分类Dev

如何在C ++中重新初始化基类

来自分类Dev

为什么可变参数函数不能“吃掉” C ++ 11中的列表初始化参数?

来自分类Dev

为什么不能在类的构造函数的初始化列表中初始化ifstream?

来自分类Dev

C#-为什么需要初始化[Out]参数

来自分类Dev

在初始化列表中初始化类数组C ++

来自分类Dev

为什么我不能对C中的malloced结构使用部分结构初始化

来自分类Dev

为什么我们不能在C中多次初始化结构?

来自分类Dev

为什么我无法在jQuery中初始化变量?

来自分类Dev

c ++模板类,初始化()与{}

来自分类Dev

C ++在初始化列表中的基类初始化之前调用函数

来自分类Dev

在C ++中初始化派生类参数

来自分类Dev

为什么在C ++类中只能初始化整数或枚举类型?

来自分类Dev

为什么派生类的构造函数在初始化列表中使用基类的默认构造函数?

来自分类Dev

为什么C ++ 11中的统一初始化在虚拟基类上表现得怪异?

来自分类Dev

为什么基类的成员不保留构造函数中首次初始化的值?

来自分类Dev

为什么在使用之前不初始化C ++ const模板化矢量?

来自分类Dev

为什么我可以通过在C ++中分配整数常量来初始化Test类的对象?

来自分类Dev

如何在C ++中初始化通用基类

来自分类Dev

C ++中的初始化程序列表和类初始化。我有无参数构造函数,但仍必须使用初始化列表?

来自分类Dev

C ++类模板初始化问题

来自分类Dev

如何在C ++中重新初始化基类

来自分类Dev

为什么可变参数函数不能“吃掉” C ++ 11中的列表初始化参数?

来自分类Dev

执行我的Objective-C程序时,为什么会出现错误“无法初始化类对象”?

来自分类Dev

为什么我无法在jQuery中初始化变量?

来自分类Dev

在C ++中初始化派生类参数

来自分类Dev

为什么我不能将指定的初始化器放置到类的扩展中?

来自分类Dev

派生类的C++初始化列表编译失败,为什么?

来自分类Dev

C++ 模板,两个不同文件中的重复类名,静态初始化

Related 相关文章

  1. 1

    C#在类中初始化静态列表

  2. 2

    如何在C ++中重新初始化基类

  3. 3

    为什么可变参数函数不能“吃掉” C ++ 11中的列表初始化参数?

  4. 4

    为什么不能在类的构造函数的初始化列表中初始化ifstream?

  5. 5

    C#-为什么需要初始化[Out]参数

  6. 6

    在初始化列表中初始化类数组C ++

  7. 7

    为什么我不能对C中的malloced结构使用部分结构初始化

  8. 8

    为什么我们不能在C中多次初始化结构?

  9. 9

    为什么我无法在jQuery中初始化变量?

  10. 10

    c ++模板类,初始化()与{}

  11. 11

    C ++在初始化列表中的基类初始化之前调用函数

  12. 12

    在C ++中初始化派生类参数

  13. 13

    为什么在C ++类中只能初始化整数或枚举类型?

  14. 14

    为什么派生类的构造函数在初始化列表中使用基类的默认构造函数?

  15. 15

    为什么C ++ 11中的统一初始化在虚拟基类上表现得怪异?

  16. 16

    为什么基类的成员不保留构造函数中首次初始化的值?

  17. 17

    为什么在使用之前不初始化C ++ const模板化矢量?

  18. 18

    为什么我可以通过在C ++中分配整数常量来初始化Test类的对象?

  19. 19

    如何在C ++中初始化通用基类

  20. 20

    C ++中的初始化程序列表和类初始化。我有无参数构造函数,但仍必须使用初始化列表?

  21. 21

    C ++类模板初始化问题

  22. 22

    如何在C ++中重新初始化基类

  23. 23

    为什么可变参数函数不能“吃掉” C ++ 11中的列表初始化参数?

  24. 24

    执行我的Objective-C程序时,为什么会出现错误“无法初始化类对象”?

  25. 25

    为什么我无法在jQuery中初始化变量?

  26. 26

    在C ++中初始化派生类参数

  27. 27

    为什么我不能将指定的初始化器放置到类的扩展中?

  28. 28

    派生类的C++初始化列表编译失败,为什么?

  29. 29

    C++ 模板,两个不同文件中的重复类名,静态初始化

热门标签

归档