2010-08-12 2 views
5

현대 C++ 디자인은 다음 예제를 제공합니다 어떤 미친 재귀가 일어날 것입니다. 어떻게 가능할까요?를 사용하여 템플릿 템플릿 클래스 인수는

편집 :

내가 해봤 Potatoswatter (죄송 웃음) 코멘트 :

template <class SmartPtr> struct SingleThreadingModel 
{ 
    class Lock 
    { 
    public: 
     Lock(SmartPtr&) 
     { 
     } 
    }; 
}; 

있지만 did'nt는했다. 템플릿 매개 변수로 전문성을 전달하는 직접 인스턴스화되는 원인이되지 않기 때문에

main.cpp:28:35: error: type/value mismatch at argument 1 in template parameter list for ‘template<class> class ThreadingModel’ 
main.cpp:28:35: error: expected a type, got ‘SmartPtr’ 
+0

아, 네. 템플릿 템플릿 매개 변수. 가장 혼란스러운 일 중 하나. –

+2

새 코드가 멋지게 보입니다. 어떤 오류가 발생합니까? 또한 Tomatoswatter는 큰 혼란을 피하는 것처럼 들리므로 피하려고 노력합니다. – Potatoswatter

답변

5

SmartPtr을 서식 파일로 사용하여 인수를 ThreadingModel으로 전달하려고합니다. SmartPtr은 구체적인 형식이 아닌 템플릿이며 injected class-name은 상속 목록에서 사용할 수 없습니다. 템플릿 파라미터는 기본 템플릿 인수가있는 경우,

모든 후속를 :

또한 당신은 그냥 임의의 위치에서 템플릿 매개 변수 (§14.1/11)에 대한 기본 인수를 사용할 수 있습니다 template-parameters는 기본 template-argument가 제공되어야한다. 고정 그 문제에

귀하의 코드 : 현대 C++ 디자인 훌륭한 책이지만,이 Vandevoorde/Josuttis 같은 템플릿에 좋은 기본적인 책을 대체 할 수

template 
< 
    class T, 
    template <class> class ThreadingModel, 
    template <class> class CheckingPolicy = EnsureNotNull 
> 
class SmartPtr 
    : public CheckingPolicy<T> 
    , public ThreadingModel<SmartPtr<T, ThreadingModel, CheckingPolicy> > 
//      ^.... now passing a concrete class ....^
{ 
    T* operator->() { 
     // the following use of SmartPtr is fine as it is the injected class-name: 
     typename ThreadingModel<SmartPtr>::Lock guard(*this); 
     // ... 
    } 
}; 

참고.

+0

의미가 있습니다. Loki의 소스 코드를 다운로드하고 ThreadingModel이 클래스 정의에 없다는 사실을 알게되었습니다. – scooterman

0

재귀는 OK입니다 : 여기

는 GCC가 저를주고있는 오류입니다.

(기본 목록에서 ThreadingModel<SmartPtr>는 사용 ThreadingModel< SmartPtr< T, CheckingPolicy, ThreadingModel > > 단지 속기는 "현재 전문화.")

나는 ThreadingModel을 할 예정이다 모르는, 그래서 그것을 구현할 수 있지만, 형태

template< class Client > class MyThreading 

의 선언을해야하며 MyThreading 멤버 함수의 Client 외부에서 내부에 아무것도 액세스 할 수 없습니다. ClientClientMyThreading에 따라 사용하면 무한 재귀가 발생합니다.

+0

감자, ThreadingModel의 선언을 구현하는 방법을 알려줄 수 있습니까? 나는 여기에서 많은 방법을 시도했지만 아무도 효과가 없었습니다. – scooterman

+0

흠, 시도해 봤어. 그것은 클라이언트 insite 클래스를 사용하거나 사용하지 않고 작동하지 않았습니다.이 예제에서는 매개 변수로 전달하는 가드를 빌드하므로 작동해야합니다. – scooterman

관련 문제