避免編譯此代碼調用不明確:不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