2013-03-02 3 views
1

는 헤더 파일 myheader.hxx 비 템플릿 클래스 B가 정의 된 클래스 템플릿 A (즉 A의 템플릿 매개 변수에 의존하지 않는다)를 정의한다고 가정 B (myheader.hxx) 또는 링크 시간에 중복 된 정의를 피하기 위해 별도의 myheader.cxx을 작성해야합니까? 이 케이스는 다른 컴파일러에 의해 일관되게 전달됩니까? 이 최상위 템플릿 아닌 경우에도 당신이 할 필요가 기술적으로 (헤더를 구현해야하므로템플릿 템플릿이 아닌 중첩 클래스 클래스를 C++ 헤더에 구현할 수 있습니까?</p> <pre><code>template<class T> class A { class B { // ... }; }; </code></pre> <p>괜찮이 경우에 구현하는 것입니다 :

+1

은'B'가 귀하의 예제에서 템플릿 매개 변수'T'에 따라 않는 이유를 설명 할 수있을 것이라 확신합니다. 직접적 이진 않지만'A :: B'와'A :: B'는 서로 관련이없는 유형입니다. – Yakk

+1

아마도 문제가되지 않지만 'class T'보다'typename T '가 바람직하다고 생각합니다. 적어도 그것은 "멋진 아이들"이하는 것처럼 보입니다. –

+0

@StephenLin - 예, 어떤 사람들은 여기에'typename'을 사용하는 것이 멋지다고 생각하지만'class'는 정확하고 짧으며 C++ 표준이 템플릿을 작성하는 방식입니다. 'class' 대신'typename'을 사용하는 기술적 인 이유는 없습니다. –

답변

0

그것은 여전히 ​​템플릿 중 하나 (또는 ​​템플릿의 일부, 울트라 정확한 정의를 모르는) 것, 그 파일이 사용 된 유일한 곳이라면 소스 파일에있을 수 있지만, 아마도 그 목적을 상실 할 것입니다.) B 자체가 일어난 경우는, 이전에 올라와 있기 때문에,

template<typename T> 
void A<T>::B::foo(...) 
{ 
    // ... 
} 

또한 :

참고 : 클래스 정의와 인라인의 멤버 함수를 구현하지 않을거야, 당신은 구문처럼 필요 템플릿 매개 변수가 될 것 같은 뭔가 :

template<typename T> 
template<typename T2> 
void A<T>::B<T2>::foo(...) 
{ 
    // ... 
} 

하지 :

template<typename T, typename T2> 
void A<T>::B<T2>::foo(...) 
{ 
    // ... 
} 
,

또는 경우 B하지 않았다하지만 B::foo, 그것은 것 않았다

template<typename T> 
template<typename T2> 
// void A<T>::B::foo<T2>(...) // not this apparently 
void A<T>::B::foo(...) 
{ 
    // ... 
} 

편집 : 분명히 적어도 GCC와 (그래서 거의 100 % 확신이 표준의 함수를 위해 위의 대신 foo<T2>foo입니다 동작) ... 나는 어떤 언어 변호사 :