gpt4 book ai didi

c++ - 模板化类构造函数在结构中使用错误的重载

转载 作者:行者123 更新时间:2023-11-28 06:28:10 25 4
gpt4 key购买 nike

测试如下:

class NotInit{};

NotInit NOT_INIT;

template<class T>
class Optional{

T value;
bool has_value;

public:
Optional() : value(), has_value(false){}
explicit Optional(NotInit):value(), has_value(false) {}
explicit Optional(T const & val):value(val), has_value(true){}
explicit Optional(Optional<T> const & other) {}

Optional& operator=(Optional<T> const & other){}
Optional& operator=(T const & other){}
};

enum X {
FIRST
};

struct Some {
Optional<X> member;
};

int main(int, char**){
Optional<X> const opt(NOT_INIT);
Some s = {NOT_INIT};
return 0;
}

Clang 3.4 提示:

../st.cpp:31:12: error: no viable conversion from 'NotInit' to 'Optional<X>'
Some s = {NOT_INIT};
^~~~~~~~
1 error generated.

为什么它提示结构初始化但提示变量?为什么不选择具有正确参数的构造函数?

缺少什么重载以便我可以使用它来初始化结构?

我无法使用 boost,我不确定如果使用 boost::optional 是否会出现此错误。

最佳答案

您正在标记您的构造函数 explicit .因此,当您尝试初始化 struct Some 时使用大括号初始化器列表,您正在触发隐式转换...

这里阻止了:

class NotInit;
template <typename T>
class Optional {
// Here => Optional(NotInit) cannot be called implicitly
explicit Optional(NotInit):value(), has_value(false) {}
};
/* ... */
Some s = {NOT_INIT}; // Implicit call to Optional<X>(NotInit): whoops!

如果删除 explicit ,你可以保持:

Some s = {NOT_INIT};

如果您选择不这样做,则必须实例化 s像这样:

Some s = {Optional<X>(NOT_INIT)};

无论如何,您都必须删除 explicit复制构造函数上的关键字(必须执行复制而不是“虚拟”构造函数)。
为什么?因为一旦Optional<X>对象是从 NOT_INIT 构建的, 必须复制到 s.member .

注意:您还可以提供一个移动构造函数,这在这种情况下更合适,因为您从 NOT_INIT 的转换中获得的对象是右值。

关于c++ - 模板化类构造函数在结构中使用错误的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28150731/

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