gpt4 book ai didi

c++ - 将类定义传递给基类时,类定义是否完整?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:04 24 4
gpt4 key购买 nike

我正在尝试编写一个 CRTP 以包含派生类型的 static constexpr,因为这不可能只用一个类来完成。这段代码在 GCC 中编译得很好,但 clang 提示 Derived 是一个不完整的类型。哪个是对的?

template<class T>
class Base {
public:
static constexpr T a = T(1), b = T(20);
};

class Derived : public Base<Derived> {
public:
int x;
constexpr Derived(int x) : x(x) {}
};

最佳答案

DerivedBase<Derived> 处不完整被实例化([class.mem]/2),这发生在定义时。您使用了 constexpr ,这需要根据 [class.static.data]/3 的初始化程序,并且当 Base<Derived> 时被实例化,其静态数据成员 ([temp.inst]/3) 的声明也被实例化,其中包括初始值设定项。但是,初始化程序试图创建一个不完整类型的对象,该对象格式错误。

您可以将您的成员声明为 const相反:

template<class T>
class Base {
public:
static const T a;
};
template <typename T>
constexpr T Base<T>::a = T(1);

因为初始化器现在在定义中,这个初始化器的实例化可以推迟到例如Derived做完了。 Demo使用 Clang。

请注意,Clang 尚未处理 a作为constexpr因为它无法急切地实例化其定义。查看错误 #24541 .

关于c++ - 将类定义传递给基类时,类定义是否完整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33546997/

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