Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
为什么boost::assign::列出isn';t与pair一起工作<;字符串,向量<;字符串>>;? 我不明白为什么这不起作用(Visual C++ 2012): #包括 #包括 #包括 #包括 使用名称空间std; int main() { 配对(“^”,boost::assign::list_of(“规则”); }_C++_Visual C++_Boost - Fatal编程技术网

为什么boost::assign::列出isn';t与pair一起工作<;字符串,向量<;字符串>>;? 我不明白为什么这不起作用(Visual C++ 2012): #包括 #包括 #包括 #包括 使用名称空间std; int main() { 配对(“^”,boost::assign::list_of(“规则”); }

为什么boost::assign::列出isn';t与pair一起工作<;字符串,向量<;字符串>>;? 我不明白为什么这不起作用(Visual C++ 2012): #包括 #包括 #包括 #包括 使用名称空间std; int main() { 配对(“^”,boost::assign::list_of(“规则”); },c++,visual-c++,boost,C++,Visual C++,Boost,错误是: include\utility(138) : error C2668: 'std::vector<_Ty>::vector' : ambiguous call to overloaded function with [ _Ty=std::string ] include\vector(786): could be 'std::vector<_Ty>::vector(std::vector<_Ty> &&)' with [ _Ty=st

错误是:

include\utility(138) : error C2668: 'std::vector<_Ty>::vector' : ambiguous call to overloaded function with [ _Ty=std::string ]
include\vector(786): could be 'std::vector<_Ty>::vector(std::vector<_Ty> &&)' with [ _Ty=std::string ]
include\vector(693): or       'std::vector<_Ty>::vector(unsigned int)' with [ _Ty=std::string ]
while trying to match the argument list '(boost::assign_detail::generic_list<T>)' with [ T=std::string ]
test.cpp(12) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2>::pair<const char(&)[2],boost::assign_detail::generic_list<T>>(_Other1,_Other2 &&,void **)' being compiled
with
[
    _Ty1=std::string,
    _Ty2=std::vector<std::string>,
    T=std::string,
    _Other1=const char (&)[2],
    _Other2=boost::assign_detail::generic_list<std::string>
]
test.cpp(12) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2>::pair<const char(&)[2],boost::assign_detail::generic_list<T>>(_Other1,_Other2 &&,void **)' being compiled
with
[
    _Ty1=std::string,
    _Ty2=std::vector<std::string>,
    T=std::string,
    _Other1=const char (&)[2],
    _Other2=boost::assign_detail::generic_list<std::string>
]
include\utility(138):错误C2668:'std::vector::vector':使用[_Ty=std::string]对重载函数的调用不明确
include\vector(786):可以是带有[_Ty=std::string]的'std::vector::vector(std::vector&&')
包含\vector(693):或带有[_Ty=std::string]的'std::vector::vector(unsigned int)'
尝试将参数列表“(boost::assign_detail::generic_list)”与[T=std::string]匹配时
cpp(12):参见正在编译的函数模板实例化“std::pair::pair(_Other1,_Other2&&,void**)”的参考
具有
[
_Ty1=std::string,
_Ty2=std::vector,
T=std::string,
_Other1=常量字符(&)[2],
_Other2=boost::assign\u detail::generic\u list
]
cpp(12):参见正在编译的函数模板实例化“std::pair::pair(_Other1,_Other2&&,void**)”的参考
具有
[
_Ty1=std::string,
_Ty2=std::vector,
T=std::string,
_Other1=常量字符(&)[2],
_Other2=boost::assign\u detail::generic\u list
]

我无法解释它为什么试图访问
无符号int
重载。。。有什么想法吗?

这是因为在C++11中添加了一个新的
构造函数来接受通用引用。因此,在VS2012(添加了此构造函数)和GCC中,当处于C++11模式时,此代码将失败

C++03中的

构造函数是:

pair( const T1& x, const T2& y ) : first(x), second(y) {}
在这种情况下,
T2==vector

通用列表
对象(由的
列表返回的对象)具有模板转换运算符:

template <class Container>
operator Container() const;
现在,当您传入一个
generic_list
对象时,它将作为
generic_list&
传入。当它尝试使用此对象调用
第二个
(类型为
向量
)构造函数时,它不知道要调用哪些构造函数:

explicit vector(size_type count, [more params with default values])
vector(const vector& other);
由于
通用\u列表
可以转换为
大小\u类型
向量
。这将导致编译错误

修复/解决方法

一种可能的修复方法是使用
convert\u to\u container
方法并指定目标类型:

pair<string, vector<string> >("^", boost::assign::list_of<string>("rules").convert_to_container<vector<string> >());
pair(“^”,boost::assign::list_of(“规则”)。convert_to_container();
另一个选项是使用
生成配对
,并显式指定其模板参数。

因此,不要这样做:

("^", boost::assign::list_of<string>("rules"))
(“^”,boost::assign::list_of(“规则”))
我必须写:

("^", boost::assign::list_of<string>("rules").convert_to_container<vector<string> >());
(“^”,boost::assign::list_of(“规则”)。convert_to_container();
让它有点不可读。。。 我添加了另一个模板:

template <typename T>
std::vector<T> vect(const boost::assign_detail::generic_list<T>& gen_list)
{ return gen_list.convert_to_container<std::vector<T> >(); }
模板
标准::矢量向量(常量boost::分配详细信息::通用列表和生成列表)
{返回gen_list.convert_to_container();}
现在可以写为:

("^", vect(boost::assign::list_of<string>("rules")))
(“^”,vect(boost::assign::list_of(“规则”))

这仍然不好,但更接近您开始使用的内容。

这是因为模板构造函数也不合适。Try:pair(“^”,boost::assign::list_of(std::string(“规则”));或对(“^”,boost::assign::list_of(“规则”)@向下投票人:为什么向下投票?@kassak:为什么
未签名int
?我在解决这个问题上并没有太大的困难,而是首先理解了为什么会发生这种情况。编译器找不到合适的构造函数,只列出了所有的单参数构造函数。它找不到构造函数,因为的列表_的结果不可转换为vector@kassak:
pair(“^”,boost::assign::list_of(“规则”)
也不起作用;我会更新这个问题。几分钟前我还以为你解决了这个问题,但现在我不太确定。为什么
pair(“^”,boost::assign::list_of(“规则”)
正在调用向量的显式构造函数吗?@Mehrdad:你是对的,我错了。我改变了我的答案,我认为它现在是正确的。啊,所以显式构造函数仍然存在问题,但这是由于转发构造函数造成的!很有趣,谢谢。顺便说一下,我想知道这是否真的意味着“完美”转发仍然是不可能的C++,因为它不让你处理显式?O也许我应该把它作为一个问题发布!有趣的是,在我弄明白之前,我遇到了另一个奇怪的问题。如果你好奇/感兴趣,这里有一个链接:@Mehrdad:explicit
的构造函数是不相关的,如果没有explicit,同样的情况也会发生。问题在于,在C++03版本中,隐式转换是从
generic_list
执行到
vector
,这只能通过将其直接转换为向量来实现,因为隐式转换只能执行一次转换。在C++11版本中,显式调用了
向量
构造函数,因此可以从
通用列表
转换为
向量
大小类型
template <typename T>
std::vector<T> vect(const boost::assign_detail::generic_list<T>& gen_list)
{ return gen_list.convert_to_container<std::vector<T> >(); }
("^", vect(boost::assign::list_of<string>("rules")))