我有一個叫做Shape
的類,它可以從任何可迭代的類中被初始化,並且一個名爲Array
的類只包含一個Shape
。但是,我得到一個編譯錯誤,當我嘗試初始化Array
我無法解釋:使用std :: initializer_list構造函數而不產生歧義?
class Shape
{
public:
template<typename Iterator>
Shape(Iterator first, Iterator last)
: m_shape(first, last) {}
template <typename Iterable>
Shape(const Iterable& shape)
: Shape(shape.begin(), shape.end()) {}
template<typename T>
Shape(std::initializer_list<T> shape)
: Shape(shape.begin(), shape.end()) {}
private:
std::vector<std::size_t> m_shape;
};
class Array
{
public:
Array(const Shape& shape)
: m_shape(shape) {}
private:
Shape m_shape;
};
int main() {
Shape s{0}; // ok
Array a1({1, 2}); // ok
Array a2({0}); // error
}
上的Shape
第二構造出現編譯錯誤:
prog.cxx:35:16: required from here
prog.cxx:14:23: error: request for member ‘begin’ in ‘shape’, which is of non-class type ‘const int’
: Shape(shape.begin(), shape.end()) {}
~~~~~~^~~~~
prog.cxx:14:38: error: request for member ‘end’ in ‘shape’, which is of non-class type ‘const int’
: Shape(shape.begin(), shape.end()) {}
~~~~~~^~~
我不不要理解這裏發生的事情。爲什麼調用Iterable
構造函數而不是initializer_list<T>
構造函數? Shape
構造函數與{0}
和Array
構造函數有什麼區別?
我無法複製;你的代碼在我的g ++ 6.3.0和我的clang ++ 3.8.1(我的意思是......如果你更正了'NDShape',對於第二個構造函數,在'Shape'中編譯得很好)。你正在使用哪種編譯器? – max66
你說得對,對不起。我簡化了代碼太多。更新的代碼現在應該會給你一個錯誤。謝謝! – AstrOne
現在我有一個錯誤,但它與您所報告的完全不同;你可以確認「沒有匹配函數調用'cbegin(const int&)[...]」錯誤嗎? – max66