我想要一個簡單的例子來了解如何使用std::enable_if
。在閱讀this answer之後,我認爲應該不難想出一個簡單的例子。我想使用std::enable_if
在兩個成員函數中進行選擇,並只允許使用其中的一個。std :: enable_if有條件地編譯一個成員函數
不幸的是,下面的代碼不能用gcc 4.7進行編譯,並且在幾個小時和幾個小時的嘗試之後我問你們我的錯誤是什麼。
#include <utility>
#include <iostream>
template< class T >
class Y {
public:
template < typename = typename std::enable_if<true>::type >
T foo() {
return 10;
}
template < typename = typename std::enable_if<false>::type >
T foo() {
return 10;
}
};
int main() {
Y<double> y;
std::cout << y.foo() << std::endl;
}
GCC報告以下問題:
% LANG=C make CXXFLAGS="-std=c++0x" enable_if
g++ -std=c++0x enable_if.cpp -o enable_if
enable_if.cpp:12:65: error: `type' in `struct std::enable_if<false>' does not name a type
enable_if.cpp:13:15: error: `template<class T> template<class> T Y::foo()' cannot be overloaded
enable_if.cpp:9:15: error: with `template<class T> template<class> T Y::foo()'
爲什麼沒有G ++刪除第二個成員函數錯誤的實例?根據該標準,僅當布爾模板參數爲true時才存在std::enable_if< bool, T = void >::type
。但爲什麼不g ++認爲這是SFINAE?我認爲重載錯誤消息來自g ++不會刪除第二個成員函數並認爲這應該是一個重載的問題。
我不確定,但我認爲它是以下內容:enable_if基於SFINAE(替代失敗不是錯誤)。但是,這裏沒有任何替換,因爲沒有參數不能用於確定使用哪個超載。你應該使T的「真」和「假」取決於T.(我知道你不想這樣做的簡單例子,但現在可能太簡單了......) – Philipp
我想到了這一點,並試圖使用'std :: is_same < T, int > ::值'和'! std :: is_same < T, int > ::值'給出了相同的結果。 – evnu