首先我应该指出这是我的第一个stackoverflow问题,所以请耐心等待。
我在使用c ++重载函数时遇到了一些问题。我正在尝试使用以下原型创建一个函数:
void push_at_command(std::string, std::vector<std::string>, int);
void push_at_command(std::string, std::vector<std::string>, std::vector<std::string>, int);
void push_at_command(std::string, std::vector<std::string>, std::vector<std::string>, std::vector<std::string>, int);
void push_at_command(std::string, std::vector<std::string>, bool, int);
我最初希望最后一次重载(带有布尔值的重载)接受boost :: regex而不是字符串向量;
void push_at_command(std::string, boost::regex, int);
但遇到歧义错误...所以只是为了快速让代码'正常工作'我想我会添加一个原型来接受一个标志,并使用向量中的第一个元素来存储一个正则表达式字符串,但我似乎遇到了类似的布尔值问题。
这就是我试图调用这些各种重载的方法:
push_at_command(
"AT?S",
boost::assign::list_of("(\\d{3}.\\d{3})"),
true,
0);
push_at_command(
"AT?S",
boost::assign::list_of("L11")("L12"),
0);
push_at_command(
"AT?S",
boost::assign::list_of("L11"),
boost::assign::list_of("L21")("L22"),
0);
这就是我得到的错误:
error: call of overloaded ‘push_at_command(const char [5], boost::assign_detail::generic_list<char [4]>, boost::assign_detail::generic_list<char [4]>, int)’ is ambiguous
note: candidates are:
note: void push_at_command(std::string, std::vector<std::basic_string<char> >, std::vector<std::basic_string<char> >, int)
note: void push_at_command(std::string, std::vector<std::basic_string<char> >, bool, int)
...与第三个函数调用有关。
请注意,在我使用bool添加重载(或将字符串向量更改为regex)之前,我没有遇到任何问题。
我假设问题与我在函数调用中使用boost :: assign有关,我意识到我不需要,但我真的需要'单行'函数调用。 ...欢迎任何建议,因为我对C ++还不熟悉。
由于
答案 0 :(得分:2)
问题是如增强文档中所见,But what if we need to initialize a container? This is where list_of() comes into play. With list_of() we can create anonymous lists that automatically converts to any container:
在这种情况下,您不希望想要能够转换为任何容器,您需要特定的s向量。由于你有这种可转换类型,它无法决定它是否应该转换为bool或vector,使调用变得模糊。
如果确实想要继续使用您创建的过载集(请退后一步并使用标记重新考虑您的方法),您需要专门将列表分配到vector(我假设list_of
为转换运算符提供了向量):
push_at_command(
"AT?S",
boost::assign::list_of("L11"),
std::vector<std::string>(boost::assign::list_of("L21")("L22")),
0);
答案 1 :(得分:2)
错误消息告诉您问题所在。陷入困境的电话是第三个:
push_at_command(
"AT?S",
boost::assign::list_of("L11"),
boost::assign::list_of("L21")("L22"),
0);
问题是它可以匹配两者 push_at_command
的第三和第四版本。它们在第三个参数的类型上有所不同:一个采用vector
而另一个采用bool
。
所以问题是boost::assign::list_of("L21")("L22)
可以转换为vector
,并且可以转换为bool
,而规则则不会优先选择其中一种转换。在这种情况下,您必须使用static_cast
来帮助编译器输出所需的类型。或者重新考虑这些函数的组织,并且可能重新排序参数,这样就不会产生歧义。 (这就是为什么,例如,std::string
有一个构造函数需要(int, char)
而没有构造函数用于单个char
,这会导致模糊;它是一个尴尬的接口,由过多的过载驱动)