2016-10-01 2 views
1

템플릿 메서드로 일반 클래스를 만들었으며 모든 메서드 인스턴스가 명시 적이며 인라인되었습니다.명시 적 클래스 멤버 인스턴스화

class MyClass 
{ 
    template<int N> inline void MyMethod(); 
    template<> inline void MyMethod<1>() { cout << 1; } 
    template<> inline void MyMethod<2>() { cout << 2; } 
}; 

처럼 나는 컴파일해야하는 template<> 구문을 사용하는 데 필요한. 클래스 선언 외부의 메서드를 명시 적으로 정의하고 구문 변형을 사용하는 등의 다른 솔루션을 사용해 보았습니다. (이 이후 버전에 시도하지, VS2008에서 만들어졌다.) 나는 두 가지 질문이

:

  • 이 이식을?
  • 의미가 있습니까?

답변

2

작성한 방식이 잘못되어 작동하지 않습니다.
회원 메소드 전문은 클래스에서 넣어해야합니다

class MyClass 
{ 
    template<int N> void MyMethod(); 
}; 

template<> void MyClass::MyMethod<1>() { } 
template<> void MyClass::MyMethod<2>() { } 

그것은 휴대용 그리고 그것은 말이 경우 대부분 실제 문제에 따라 달라집니다, 그것은 당신의 예에서 말하기 어렵다.

+0

이러한 템플릿 메서드의 전문화 (헤더에 이러한 전문 분야의 적절한 선언이 포함되어있는 경우)를 소스 파일로 옮길 수 있다는 점은 주목할 가치가 있습니다. 그것이 특수화되지 않은 메소드 템플리트로 수행 될 수는 없지만 ... –

+0

왜 작동합니까? –

+0

@YvesDaoust 사실 (https://godbolt.org/g/yEBYVo) [작품] (https://godbolt.org/g/GzWrlo). 어쩌면 컴파일러의 확장일까요? – skypjack

1

클래스 본문의 멤버 템플릿을 완전히 전문화 할 수 없습니다. 부분 전문화는 허용됩니다. 전체 전문화는 클래스 본문 밖에서 선언/정의되어야합니다 (정의되지 않은 경우 cpp 파일에 정의되어야 함). inline.

참고로이 question.

+0

그리고 부분적으로는 메소드를 부분적으로 특수화 할 수 없으므로 (구문 적으로 금지되어 있습니다.) 클래스 내에서 메소드 전문화를 정의 할 수 없습니다 ... 그러나 정의가 소스 파일에 있어야한다는 것이 확실하지 않은지 저는 생각합니다. 선택되지 않은 방법 템플릿에 대한 옵션은 아니지만 옵션입니다 ... –

+0

죄송합니다, 인라인을 언급하지 않았습니다. –

관련 문제