我使用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的argument-per-element构造函数是显式的,因此在从支撑的初始化程序复制初始化参数时不合格.换句话说,两种功能都不应该被选中.
您需要在参数中显式构造元组.