我有問題在類專業化中聲明一個不完整的結構體,然後再定義它。定義不完整的專業類結構
struct Foo {
template <bool Y, typename D>
struct Bar {};
template <typename D>
struct Bar<true, D> {
struct Qux;
};
template <typename D>
struct Bar<true, D>::Qux { int x; };
};
這個代碼在GCC,但在鐺3.3失敗:
r.cpp:42:26: error: non-friend class member 'Qux' cannot have a qualified name
struct Bar<true, D>::Qux { int x; };
~~~~~~~~~~~~~~^
如果代碼是寫在命名空間範圍(無struct Foo
),它工作在鐺了。另一方面,如果struct Foo
被轉換爲模板,如下所示,代碼在gcc-4.9(未發佈)中中斷,儘管它繼續在gcc-4.7中工作。
template <typename X>
struct Foo {
template <bool Y, typename D>
struct Bar {};
template <typename D>
struct Bar<true, D> {
struct Qux;
};
template <typename D>
struct Bar<true, D>::Qux { int x; };
};
鏘失敗:
r.cpp:43:26: error: template specialization or definition requires a template parameter list corresponding to the nested type 'Bar<true, type-parameter-1-0>'
struct Bar<true, D>::Qux { int x; };
^
r.cpp:43:26: error: non-friend class member 'Qux' cannot have a qualified name
struct Bar<true, D>::Qux { int x; };
~~~~~~~~~~~~~~^
2 errors generated.
GCC-4.9失敗,類似的錯誤:
r.cpp:43:26: error: too few template-parameter-lists
struct Bar<true, D>::Qux { int x; };
^
你能解釋爲什麼嗎? –
-1只有代碼和沒有解釋的答案? – Manu343726