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
我猜這是違反了一個定義規則,編譯器只是「挑選了一個」來執行,但我對這個評估並不完全確定。 –
由於不能推導出「T」,因此第一個不能使用。在更近的時候,[導致程序不合格](https://timsong-cpp.github.io/cppwp/temp.class.spec#match-3)。 –
我認爲它不需要第一個專門化,因爲它不能解決T的類型。gcc給了我一個編譯你的代碼的錯誤消息:模板參數在部分專業化中不能被推導。如果我明確指定模板中使用的類型(int而不是T),它很有效,顯然不是你想要的。 – Klaus