重载函数歧义

时间:2013-12-09 17:02:42

标签: c++ boost

首先我应该指出这是我的第一个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 ++还不熟悉。

由于

2 个答案:

答案 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,这会导致模糊;它是一个尴尬的接口,由过多的过载驱动)