2017-02-14 33 views
0

我想要使用在另一個結構A內定義的類型來專用結構B.可以在帖子中看到MWE向下。使用typename的模板結構專用化::

首先我很驚訝B的兩個專業可以一起存在。我添加了第二個來顯示問題。如果刪除,代碼請參閱B沒有適當的專業化。 我寧願只保留第一個專業化。

所以,我的問題是:

  • 爲什麼B的兩個專業可以共存?
  • 爲什麼第一個不適用於main的實例?

definitions.h:

template <class T> 
class X {}; 

template <class T> 
class Xitem {}; 


template <class T> 
struct A; 

template <class T> 
struct A< X<T> > { 
    typedef Xitem<T> Titem; 
}; 

template <class T> 
struct B; 

template <class T>//I need this one only 
struct B< typename A< X<T> >::Titem > { 
    static void foo() { 
     std::cout << "foo 1" << std::endl; 
    } 
}; 

template <class T> 
struct B< Xitem<T> > { 
    static void foo() { 
     std::cout << "foo 2" << std::endl; 
    } 
}; 

main.cpp中:

#include "definitions.h" 

int main(int argc, char *argv[]) { 

    B< A< X<int> >::Titem >::foo(); 
} 

輸出: 「富2」 使用Xcode的7

+0

我猜這是違反了一個定義規則,編譯器只是「挑選了一個」來執行,但我對這個評估並不完全確定。 –

+1

由於不能推導出「T」,因此第一個不能使用。在更近的時候,[導致程序不合格](https://timsong-cpp.github.io/cppwp/temp.class.spec#match-3)。 –

+1

我認爲它不需要第一個專門化,因爲它不能解決T的類型。gcc給了我一個編譯你的代碼的錯誤消息:模板參數在部分專業化中不能被推導。如果我明確指定模板中使用的類型(int而不是T),它很有效,顯然不是你想要的。 – Klaus

回答

0

問題的答案在評論中給出。謝謝。