gpt4 book ai didi

c++ - 为什么我需要在成员初始化列表中重复我的基类的模板参数?

转载 作者:行者123 更新时间:2023-12-01 14:12:48 25 4
gpt4 key购买 nike

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

error: type 'Base<int, true>' is not a direct or virtual base of'Derived'


完整代码在这里:
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 时执行此操作是一个模板,base 的类型取决于它的模板参数。
这会编译,例如:

template <typename T>
class Derived : public Base<int, false>
{
public:
Derived(const T& t) : Base(t) {}
};
据我所知,这里(在成员初始化列表中) Base实际上是 Base<...> 的注入(inject)类名,像其他一切一样继承自它。
如果基类的类型确实依赖于模板参数,那么它继承的注入(inject)类名将变得不可访问(至少直接不可访问),就像从它继承的任何其他成员一样。
对于成员变量/函数,您需要添加 this->要访问它,但对于类型成员,您需要 Derived:: :
template <typename T>
class Derived : public Base<T, false>
{
public:
Derived(const T& t) : Derived::Base(t) {}
};

关于c++ - 为什么我需要在成员初始化列表中重复我的基类的模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62556571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com