#include <type_traits>
struct A{};
struct B{};
template <typename T>
struct Foo
{
typename std::enable_if<std::is_same<T, A>::value>::type
bar()
{}
typename std::enable_if<std::is_same<T, B>::value>::type
bar()
{}
};
Thông báo lỗi:Tại sao SFINAE (enable_if) không hoạt động đối với các chức năng thành viên của một mẫu lớp?
14:5: error: 'typename std::enable_if<std::is_same<T, B>::value>::type Foo<T>::bar()' cannot be overloaded 10:5:
error: with 'typename std::enable_if<std::is_same<T, A>::value>::type Foo<T>::bar()'
Nguồn trên cpp.sh. Tôi nghĩ cả hai typename std::enable_if<std::is_same<T,?>::value>::type
không thể hợp lệ cùng một lúc.
Sửa
Đối với hậu thế ở đây là chỉnh sửa của tôi dựa trên câu trả lời @ KerrekSB của - SFINAE chỉ hoạt động cho suy luận mẫu luận
#include <type_traits>
struct A{};
struct B{};
template<typename T>
struct Foo
{
template<typename U = T>
typename std::enable_if<std::is_same<U,A>::value>::type
bar()
{
}
template<typename U = T>
typename std::enable_if<std::is_same<U,B>::value>::type
bar()
{
}
};
int main()
{
};
* SFINAE chỉ hoạt động cho các đối số mẫu suy luận * ... Đó là chìa khóa !!!!! Cảm ơn bó @Kerrek. BTW, bài viết gốc của tôi là MWE. – Olumide
@Olumide: Có, chỉ những lỗi thay thế do khấu trừ không phải là lỗi. Thay thế yêu cầu rõ ràng không thành công như một lỗi cứng. (An MFE là đủ cho trường hợp này!) –
Có cách nào có một constructor quá tải như thế này? – Brent