c ++构造函数使用initializer_list重载歧义

时间:2017-07-19 15:18:31

标签: c++ constructor overloading initializer-list ambiguous

我有一个包含两个构造函数的类:

myclass(std::initializer_list<int>);
myclass(std::initializer_list<std::initializer_list<int>);

以下声明有效

myclass obj1 = {{1,2},{3,4},{5,6}}; //a 3x2 matrix
myclass obj2 = {{1,2,3}}; // a 1x3 matrix

但是下面的声明不起作用,当我尝试编译时,它表示它是不明确的

myclass obj3 = {{1},{2},{3}};  //a 3x1 matrix

以下解决了这个问题:

myclass obj3 = {std::initializer_list<int>({1}), 
                std::initializer_list<int>({2}), 
                std::initializer_list<int>({3})};

但我觉得这个解决方案难以置信且丑陋。是否有可能做得更好?

1 个答案:

答案 0 :(得分:2)

编译器说{{1},{2},{3}}不明确的原因是{1}可以是intstd::initializer_list<int>。所以你要么有一个int列表,要么列出一个int列表,编译器无法确定你真正想要的东西

当您执行{{{1},{2},{3}}}{int,{{2}},tf.unique_with_counts}时,最里面的大括号代表int,下一个最内层代表import tensorflow as tf X = tf.constant([1, 1, 0, 0, 1, 2, 2, 0, 1, 2]) op = tf.unique_with_counts(X) sess = tf.InteractiveSession() res = sess.run(op) print(res.count) # [4 3 3] 个列表,然后最外面的大括号代表一个列表那份清单。您需要这些额外的大括号来消除编译器的歧义。