gpt4 book ai didi

c++ - 为什么在某些情况下不能在没有强制转换的情况下引用 public static const 变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:43 26 4
gpt4 key购买 nike

以下代码说明了我遇到的一个问题,它无法使用对 Def::DEFAULT 的 undefined reference 进行编译;

但是,如果我在 main 中注释掉第二行,它将编译并运行良好,我可以通过转换为 int 或直接分配给 Val 类 int 数据成员来“查看”分配给 DEFAULT 的值。

template <typename T, T def>
class Def {
public:
static const T DEFAULT = def;
enum {DEFAULT_ENUM = DEFAULT};
};


class Val {
public:
Val& operator=(const int &val_in) {
val = val_in;
return *this;
}

int val;
};


typedef Def<int, 10> Def_t;

Val test_val;

int main()
{
test_val = Def_t::DEFAULT_ENUM; // works
test_val = Def_t::DEFAULT; // fails to compile
test_val = (int) Def_t::DEFAULT; // works
test_val.val = Def_t::DEFAULT; // works
}

最佳答案

你的代码有未定义的行为,因为你正在使用 Def_t::DEFAULT 而没有定义它 [basic.def.odr]/3:

Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program; no diagnostic required.

类定义中的声明不是定义[class.static.data]/2:

The declaration of a static data member in its class definition is not a definition ... . The definition for a static data member shall appear in a namespace scope enclosing the member’s class definition. ...

如果在为 Def_t::DEFAULT 添加声明时您的代码仍然无法编译,那么这是编译器中的错误。可以通过在命名空间范围内放置以下内容来添加定义:

template<typename T, T def>
T const Def<T, def>::DEFAULT;

如果你希望它在 T 不是整数或枚举类型时工作,请将 DEFAULT 的初始化程序放在这个命名空间范围定义中而不是类定义中.

关于c++ - 为什么在某些情况下不能在没有强制转换的情况下引用 public static const 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16258601/

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