Tôi đang cố gắng để có được một ví dụ đơn giản để làm việc để hiểu cách sử dụng std::enable_if
. Sau khi tôi đọc câu trả lời này , tôi nghĩ rằng không quá khó để đưa ra một ví dụ đơn giản. Tôi muốn sử dụng std::enable_if
để chọn giữa hai hàm thành viên và chỉ cho phép một trong số chúng được sử dụng.
Thật không may, những điều sau đây không được biên dịch với gcc 4.7 và sau nhiều giờ cố gắng, tôi đang hỏi các bạn rằng lỗi của tôi là gì.
#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 báo cáo các vấn đề sau:
% 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()'
Tại sao g ++ không xóa phần khởi tạo sai cho hàm thành viên thứ hai? Theo tiêu chuẩn, std::enable_if< bool, T = void >::type
chỉ tồn tại khi tham số mẫu boolean là đúng. Nhưng tại sao g ++ không coi đây là SFINAE? Tôi nghĩ rằng thông báo lỗi quá tải xuất phát từ vấn đề g ++ không xóa chức năng thành viên thứ hai và tin rằng đây sẽ là một tình trạng quá tải.
std::is_same< T, int >::value
và ! std::is_same< T, int >::value
cho kết quả tương tự.