gpt4 book ai didi

c++ - 无法将字符串文字分配给装箱的 std::string vector

转载 作者:IT老高 更新时间:2023-10-28 21:42:03 25 4
gpt4 key购买 nike

这是我的类型系统的简化版本:

#include <string>
#include <vector>

template<typename T>
class Box {
public:
Box(const T& value) : _value(value) {};
private:
T _value;
/* ... */
};

typedef Box<int> Int;
typedef Box<double> Double;
typedef Box<std::string> String;

int main(int argc, char* argv[]) {
String a("abc");
std::vector<String> b = { std::string("abc"), std::string("def") };

// error C2664: 'Box<std::string>::Box(const Box<std::string> &)' : cannot convert argument 1 from 'const char' to 'const std::string &'
std::vector<String> c = { "abc", "def" };
}

ab编译,c没有,原因似乎是我尝试从 const char 初始化.这提出了两个问题:

  1. 为什么是 b可能但不是c ?是因为std::vector<Box<std::string> >中的嵌套模板吗? ?

  2. 我可以制作c吗?在不破坏一般拳击机制的情况下工作(参见 typedef Box<double> Double ?

最佳答案

c 目前需要 2 次隐式用户转换(const char [N] -> std::string -> String) 而只允许一个。

您可以将模板构造函数添加到 Box

template<typename T>
class Box {
public:
Box() = default;
Box(const Box&) = default;
Box(Box&&) default;
~Box() = default;

Box& operator=(const Box&) = default;
Box& operator=(Box&&) = default;

template <typename U0, typename ...Us,
std::enable_if_t<std::is_constructible<T, U0, Us...>::value
&& (!std::is_same<Box, std::decay_t<U0>>::value
|| sizeof...(Us) != 0)>* = nullptr>
Box(U0&& u0, Us&&... us) : _value(std::forward<U0>(u0), std::forward<Us>(us)...) {}
private:
T _value;
/* ... */
};

Demo Demo2

关于c++ - 无法将字符串文字分配给装箱的 std::string vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44108754/

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