2012-07-17 1 views
2

다음은 단순화 된 문제입니다.인스턴스화 오류 후 특수화를 피하는 방법은 무엇입니까?

Outer::Inner에 대한
template <class T> 
std::string name(const T&); // This is the template 
          // I want to explicitly specialize. 

class Outer 
{ 
    class Inner 
    { 
    }; 

    class Container : public ::Container<Inner> // This causes also an implicit 
               // specialization of f::name 
    { 
    }; 
}; 

내가 전문 어떻게

template <class T> 
std::string name(const T&); 

?

template <class T> 
std::string name(const T&); 

// 1. Here I cannot forward declare a nested class 

class Outer 
{ 
    class Inner 
    { 
    }; 

    // 2. Here I get error: explicit specialization 
    // in non-namespace scope 'class Outer' 

    class Container : public ::Container<Inner> 
    { 
    }; 
}; 

// 3. Here I get error: specialization of '...' after instantiation 

가 어떻게이 문제를 해결할 수 :

은 내가 생각 세 곳에서 명시 적으로 전문화를 선언 할 수 없습니다?

답변

2

this article을 살펴보십시오. 당신은 당신이 "전문"할 특정 유형에 대한 name 함수를 작성 나을 수 있습니다

std::string name(const Outer::Inner&); 
+0

감사합니다! 이제 나는 그것을보고 나는 내가 생각했던 것에 놀랐다. 과부하 일뿐입니다. 나는 또한 기사를 볼 것이다! –

+0

한 가지 더. 어디에서 과부하를 선언합니까? 문제가 남아있는 것 같습니다. 템플릿 케이스와 같은 이유로 장소가 없습니다. –

+0

다른 곳에서와 마찬가지로 필요할 때마다 선언하고 .cpp에서 정의 할 수 있습니다. .h와 .cpp 파일을 여러 곳에서 필요로한다면 이것을 전용으로 사용할 수 있습니다 ('inline'을 사용하여 정의를 .h에 넣을 수도 있습니다) – juanchopanza