에서 MSVC의 작품, 컴파일 오류가 I이이 아래로 비등 일부 코드 :- GCC
#include <type_traits>
struct CByteArray {};
struct CIODevice {
template <typename T>
CIODevice& operator<< (T value)
{
static_assert(std::is_pod<T>::value, "This method is only intended for POD types");
return *this;
}
template <>
CIODevice& operator<< (CByteArray data)
{
return *this;
}
template <typename T>
CIODevice& operator>> (T& value)
{
static_assert(std::is_pod<T>::value, "This method is only intended for POD types");
return *this;
}
};
int main()
{
CIODevice device;
int i = 0;
device << i;
device >> i;
return 0;
}
그것은 MSVC에서 컴파일하지만 GCC 내가이 얻을 :
prog.cpp:13:12: error: explicit specialization in non-namespace scope ‘struct CIODevice’
template <>
^
prog.cpp:20:11: error: too many template-parameter-lists
CIODevice& operator>> (T& value)
^
prog.cpp: In function ‘int main()’:
prog.cpp:32:9: error: no match for ‘operator>>’ (operand types are ‘CIODevice’ and ‘int’)
device >> i;
^
나는 그것을 얻지 못한다, 여기의 실수는 무엇인가?
(BTW, SFINAE는 전체 클래스를 전문으로하는 것보다이 케이스를 처리하는보다 우아한 방법이며 크로스 플랫폼입니다. http://en.cppreference.com/w/cpp/types/enable_if를 참조하고 토끼에 오신 것을 환영합니다. 템플릿이 아닌 구멍을 사용하는 것입니다. – IdeaHat
@MadScienceDreams : 저는 클래스를 전문으로하지 않고 템플릿이 아닌 클래스의 템플릿 메서드를 전문적으로 다루고 있습니다. 또한 지난 2 일 동안 (말 그대로) enable_if'를 입력 한 다음 예상대로 작동하지 않는 이유를 이해 한 다음 다른 템플릿 트릭을 사용하여 제거하십시오. 이제는 더 이상 enable_if를 사용하지 마십시오. –
이것은 중복 질문이 아닙니다. 참조 된 질문은 클래스 템플릿 내에서 멤버 함수 템플릿을 특수화하는 것입니다.이 템플릿 클래스는 명시 적으로 템플릿이 아닌 클래스에 대한 것입니다. –