避免编译此代码调用不明确:不SFINAE
#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;
}
我不知道它是不是wh在@skypjack答案的意思,但我让它无论如何其替代方法。
为了更加清楚,添加'TestClass的<1> :: doAction'和'TestClass的<2> :: doAction'是两个不同的功能,而不是相同功能的重载,这是误解的常见原因。 –
@ Peregring-lk完成。谢谢。 – skypjack