Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 叮当声和gcc中的此警告不';似乎不对_C++_C++11_Constructor_Initializer List - Fatal编程技术网

C++ 叮当声和gcc中的此警告不';似乎不对

C++ 叮当声和gcc中的此警告不';似乎不对,c++,c++11,constructor,initializer-list,C++,C++11,Constructor,Initializer List,我相信Bjarne Strutrup的新书TCPL第四版第66页中的示例有一个小错误,因为class Vector\u容器没有std::initializer\u list构造函数。错误消息证实了这一点 #include <iostream> class Vector{ double* elem; int sz; public: Vector(int s):elem{new double[s]}, sz{s} { for(int i = 0; i != sz

我相信Bjarne Strutrup的新书TCPL第四版第66页中的示例有一个小错误,因为
class Vector\u容器
没有
std::initializer\u list
构造函数。错误消息证实了这一点

#include <iostream>

class Vector{
    double* elem;
    int sz;
public:
    Vector(int s):elem{new double[s]}, sz{s} { for(int i = 0; i != sz; ++i) elem[i]= 0; }
    Vector(std::initializer_list<double> lst): elem{new double[lst.size()]}, sz(lst.size()) { std::copy(lst.begin(), lst.end(), elem); }
    ~Vector() { delete[] elem; }
    double& operator[](int i) { return elem[i]; }
    int size() const { return sz; }
};

class Container{
public:
    virtual double& operator[](int i) = 0;
    virtual int size() const = 0;
    virtual ~Container() {}
};

class Vector_container:public Container{
    Vector v;
public:
    Vector_container(int s): v{s}{}
    ~Vector_container() {}
    double& operator[](int i) { return v[i]; }
    int size() const {return v.size(); }
};

void use(Container& c)
{
    const int sz = c.size();
    for(int i = 0; i != sz; i++) std::cout << c[i] << '\n';
}

int main()
{
    Vector_container vc{10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    use(vc);
}
#包括
类向量{
双*元素;
int sz;
公众:
向量(ints):elem{new double[s]},sz{s}{for(inti=0;i!=sz;++i)elem[i]=0;}
向量(std::initializer_list lst):elem{new double[lst.size()]},sz(lst.size()){std::copy(lst.begin(),lst.end(),elem);}
~Vector(){delete[]elem;}
双重&运算符[](int i){返回元素[i];}
int size()常量{return sz;}
};
类容器{
公众:
虚拟双运算符[](int i)=0;
虚拟整数大小()常量=0;
虚拟~Container(){}
};
类向量_容器:公共容器{
向量v;
公众:
向量容器(ints):v{s}{}
~Vector_container(){}
双精度&运算符[](int i){返回v[i];}
int size()常量{返回v.size();}
};
无效使用(容器和c)
{
常量int sz=c.size();

对于(inti=0;i!=sz;i++)std::cout关于重载分辨率,您是正确的:Inside

Vector_container(int s): v{s}{}
初始化
v{s}
选择以下构造函数:

Vector(std::initializer_list<double> lst)

Vector\u container(int s)
内部,
s
不是一个常量表达式,因此有一个从
int
double
的缩小转换。clang++3.5说这是一个错误,而不仅仅是一个警告。“因此,我想知道是否有任何方法可以强制调用
Vector(int)
构造函数。”不要在
Vector\u容器(int s)
?-->
Vector\u容器(int s):v(s){}
@dyp
不要在Vector\u容器(int s)中使用列表初始化?
但是如果你想在类中保留这个构造函数呢?我不确定你指的是哪个构造函数。@dyp我想说的是:如何强制向量(int)构造函数在向量类中维护初始值设定项列表构造函数?
向量容器(int s):v(s){
这正是我想要的。通过这种方式,你可以强制调用向量(int)构造函数。回答得好。Tks。另一个“统一初始化”的陷阱。也许如果它不包括
std::initializer_list
-初始化,那么它就不会那么复杂,也不会那么令人惊讶了…
当std::initializer_list是从{s}创建的,其中s是int类型时,从int到double(n3485)[dcl.init.list]/7
的转换范围会缩小,但是这种所谓的“缩小”转换?@WakeupBrazil你的意思是,为什么他们会使格式错误?这是个好问题,如果
int
的所有值都可以用浮点类型表示。这一定与浮点有关,因为允许在整数之间进行类似的转换。
Vector_container(int s): v(s) {}  // initializer-list ctor not viable