2012-04-06 89 views
2

我有嵌套模板及其模板專業化的問題。鑑於以下類:專用模板<typename T,模板<typename> class U>

小模板類

template<class U> 
class T { 
public: 
    T(){} 
    virtual ~T(){} 

}; 

而且某種嵌套模板

template<typename T, template<typename> class U> 
class A { 
public: 
    void foo() 
    { 
     std::cerr << "A generic foo"; 
    } 
}; 

和少量的main.cpp

int main(int argc, const char *argv[]) 
{ 
    A<int,T> *a = new A<int,T>; 
    a->foo(); 

    //This wont work: 
    A<double,T*> *b = new A<double,T*>; 
    b->foo(); 

    return 0; 
} 

現在我需要一個如果U是指針,則專精:

A<double,T*> *b = new A<double,T*>; 
    b->foo(); 

如何做到這一點?我想是這樣的:

template<typename T, template<typename> class U> 
class A< T, U* > 
{ 
public: 
void foo() 
{ 
    std::cerr << "A specialized foo"; 
} 
}; 

,但它只是在

A.h:18:16: Error: Templateargument 2 is invalid 
+0

您似乎很困惑。 – 2012-04-06 18:48:23

+0

@ildjarn:不,這很好,因爲'A'需要一個具有一個參數的模板類型。 「T」符合該法案。 – bitmask 2012-04-06 19:08:42

+0

@bitmask:啊,完全正確,我顯然沒有注意。 – ildjarn 2012-04-06 19:35:19

回答

0

解決什麼你搭售做是不可能的,因爲T*已經沒有任何意義。它既不是一個合適的類型,也不匹配一個需要額外參數的模板。如果U代表T*,那麼U<int>是什麼?您的意思可能是T<int>*,但與您的聲明不符,因此無法將該類型插入A

既然你問了一個解決這個問題的方法,從我的頭頂開始,就像這樣。

接受第三個模板參數A,我會打電話Expander並將其設置爲默認的:

template <typename T> struct Expander { 
    typedef T type; 
}; 

然後調用A時,你可以說

A<int,T> normal; 
A<int,T,PtrExpander> pointer; 

template <typename T> struct PtrExpander { 
    typedef T* type; 
}; 

and A會是:

template<typename T, template<typename> class U, template <typename> class E = Expander> class A { 
    typedef typename E<U<Your_Args_to_U> >::type; 
+0

但T代表一個模板,不是嗎? – user988017 2012-04-06 19:22:21

+0

@ user988017:是的,但是'T *'沒有。由於'T'不是一個類型(它是一個模板),你不能有一個指向它的指針。 C++ *可以*允許你使用這種非正式的符號,但它不會。 – bitmask 2012-04-06 19:23:39

+0

我明白了......解決這個問題的最簡單方法是什麼? – user988017 2012-04-06 19:27:32

相關問題