我正在尝试将projet从VS2008转换为2010,但是由于添加了move构造函数(并且可能是在这里嵌套list_of的事实)而遇到了问题。以下代码片段显示了错误(在实际代码中,这些结构用于初始化一些静态变量):
enum some_enum {R, G, B};
typedef std::pair<some_enum, some_enum> Enum_Pair;
typedef std::vector<some_enum> Enum_list;
typedef std::pair<Enum_Pair, Enum_list> Some_Struct;
typedef std::list<Some_Struct> Full_Struct;
#define MAKEFULLSTRUCT(First_, Second_, some_enums)\
(Some_Struct(Enum_Pair(First_, Second_), list_of (some_enums) ))
int main()
{
int i = G;
Full_Struct test_struct = list_of
MAKEFULLSTRUCT(R, R, R).to_container(test_struct);
}
这导致
error C2668: 'std::vector<_Ty>::vector' : ambiguous call to overloaded function
with [_Ty=some_enum]
vector(593): could be 'std::vector<_Ty>::vector(std::vector<_Ty> &&)'
with [ _Ty=some_enum]
vector(515): or 'std::vector<_Ty>::vector(unsigned int)'
with [ _Ty=some_enum]
while trying to match the argument list '(boost::assign_detail::generic_list<T>)'
with [ T=some_enum ]
有什么方法可以在仍使用boost::list_of的情况下解决此问题?还是我必须切换到另一个初始化机制?
最佳答案
这看起来像Boost.Assign中的错误。 list_of
的返回类型具有泛型转换为T
类型,而完全不尝试限制T
。因此,两种std::vector
构造函数(采用std::vector &&
的构造函数和采用unsigned int
的构造函数)都一样好,从而导致模棱两可。
您的解决方法是使用convert_to_container
,如下所示:
#define MAKEFULLSTRUCT(First_, Second_, some_enums)\
(Some_Struct(Enum_Pair(First_, Second_), \
list_of(some_enums).convert_to_container<Enum_list>()))
关于c++ - VS2010中与list_of的模棱两可的调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12352692/