다음은 예제 코드입니다.
template<class T>
class A
{
public:
A(T t): x(t){}
T getX();
private:
T x;
};
template<class T>
T A<T>::getX()
{
return x;
}
// member function specialization
template<> // works with and without template<>
long A<long>::getX()
{
return 1000L;
}
위의 코드 는 멤버 함수 전문화 이전에 template <>의 유무에 관계없이 작동합니다 . 왜 ? 그런 경우 어떤 차이가 있습니까?
Edit1 : 이 템플릿을 사용합니다 (VS 2012 컴파일러).
A<int> a1(1);
cout<<a1.getX()<<endl;
A<long> a2(1);
cout<<a2.getX()<<endl;
규정을 준수하지 않습니다.
FWIW, GCC 4.8은 template <>
.
컴파일러가 버그가 있거나이를 지원하는 확장 기능이 있습니다. MSVS 2012에서 코드를 수락 함을 확인할 수 있습니다. 나는 MSVS 2013 November CTP도 불만없이 그것을 먹어 치운다 고 들었습니다. 공정하게 말하면 Visual Studio는 항상 템플릿 사양에 대해 상당히 관대했습니다.
[C++11: 14.7/3]:
함수 템플릿, 클래스 템플릿, 클래스 템플릿 의 멤버 또는 멤버 템플릿에 대해 명시 적 전문화를 선언 할 수 있습니다 . 에 의해 명시적인 전문화 선언이 도입되었습니다template<>
. [..]
이 규칙의 유일한 예외는 다음과 같습니다.
[C++11: 14.7.3/5]:
[..] 명시 적으로 특수화 된 클래스 템플릿의 멤버는template<>
구문을 사용하지 않고 일반 클래스의 멤버와 동일한 방식으로 정의됩니다 . [..]
… 그러나 여기에는 적용되지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다