Я использую компилятор Apple LLVM 4.2 для компиляции этого кода C ++. Я перегружал функцию-член различными комбинациями кортежей, и я считаю, что я правильно вызываю одну из них, но компилятор обнаружил неоднозначность. По сути, я пытаюсь вызвать метод (1) ниже, но компилятор находит метод (2) также приемлемым / совместимым. Это почему? У меня включены флаги C ++ 11.
enum class Enum1 { ... }
enum class Enum2 { ... }
enum class Enum3 { ... }
enum class Enum4 { ... }
void myMethod() {
Enum1 e1;
Enum2 e2;
Enum3 e3;
doSomething({e1,e2,e3}); // should pick (1), yet compiler finds (2) compatible also!?
}
inline void doSomething(const tuple<Enum1,Enum2,Enum3>& p) { // (1)
...
}
inline void doSomething(const tuple<Enum1,Enum2,Enum3,Enum4>& p) { // (2)
...
}
Вы уверены, что компилятор находит оба приемлемых, и не говорит, что ни один не является приемлемым и перечисляет кандидатов? std::tuple
Конструктор аргументов на элемент explicit
и поэтому не подходит, когда дело доходит до копирования-инициализации параметра из фигурного инициализатора. Другими словами, ни одна функция не должна быть выбрана.
Вам необходимо явно создать кортеж в аргументе.
Других решений пока нет …