2013-12-09 6 views
4

Во-первых, я должен указать, что это мой первый вопрос о стеке, поэтому, пожалуйста, несите меня.Перегруженная функция неоднозначности

У меня возникли проблемы с перегрузкой функции в 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); 

Я изначально хотел последнюю перегрузку (тот с булевым) принять повышающий :: регулярного выражения вместо строки вектора;

void push_at_command(std::string, boost::regex, int); 

, но столкнулся с ошибками неоднозначности ... так просто, чтобы быстро получить код «работающий» Я думал, что я хотел бы добавить прототип принять флаг и использовать первый элемент в векторе для хранения регулярных выражений string, но я, похоже, сталкиваюсь с аналогичными проблемами с булевым.

Это, как я пытаюсь вызвать эти различные перегрузки:

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 (или изменил вектор строки на регулярное выражение).

Я предполагаю, что проблема имеет какое-то отношение ко мне, используя 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, делая вызов неоднозначным.

Если вы действительно заинтересованы в том, м при условии, что здесь list_of обеспечивает оператор преобразования в вектор):

сообщение
push_at_command(
    "AT?S", 
    boost::assign::list_of("L11"), 
    std::vector<std::string>(boost::assign::list_of("L21")("L22")), 
    0); 
+0

Но если вы сохраняете только функцию, которая принимает bool, вы получите Ошибка: недопустимый литой из типа 'std :: _ Deque_iterator 'для ввода' bool' , Это означает, что он не может быть преобразован в bool – yosim

+0

Спасибо за совет, я сейчас изменил и переработал мою программу, чтобы не использовать эти перегрузки. –

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, что приводит к неоднозначностям, это неудобный интерфейс, вызванный слишком большим количеством перегрузок).

+0

См. Мой вопрос к Марку Б. Это относится и к вашему ответу. – yosim

Смежные вопросы