【发布时间】:2016-11-12 20:59:55
【问题描述】:
编译这段代码:
#include <iostream>
template <int N>
struct TestClass {
template <int N2, typename std::enable_if<N2 == N, int>::type = 0>
void doAction() { std::cout << "TestClass::doAction<" << N << ">();\n"; }
};
struct HostClass : public TestClass<1>, public TestClass<2> {
};
int main(int argc, const char * argv[]) {
HostClass hostClass;
hostClass.doAction<1>();
hostClass.doAction<2>();
return 0;
}
导致不明确的调用错误,因为 doAction 同时在 TestClass<1> 和 TestClass<2> 父类中。
main.cpp:33:15:在多个不同类型的基类中发现成员“doAction”
但是std::enable_if 不会消除这种歧义?
编辑:
我认为这种模棱两可的真正原因与这个问题相同:
可以使用using关键字解决歧义,如答案所示:
#include <iostream>
template <int N>
struct TestClass {
template <int N2, typename std::enable_if<N2 == N, int>::type = 0>
void doAction() { std::cout << "TestClass::doAction<" << N << ">();\n"; }
};
struct HostClass : public TestClass<1>, public TestClass<2> {
using TestClass<1>::doAction;
using TestClass<2>::doAction;
};
int main(int argc, const char * argv[]) {
HostClass hostClass;
hostClass.doAction<1>(); // OK, compile
hostClass.doAction<2>(); // OK, compile
//hostClass.doAction<3>(); // OK, doesn't compile : "candidate template ignored: disabled by 'enable_if' [with N2 = 3]"
return 0;
}
我不知道这是否是 @skypjack 答案的意思,但我还是让它作为替代方法。
【问题讨论】:
标签: c++ inheritance sfinae ambiguous