2017-08-05 28 views
4

根據17.7.3 [temp.expl.spec]段落5(N4659模板<>爲一個構件枚舉

... Members of an explicitly specialized class template are defined in the same manner as members of normal classes, and not using the template<> syntax. The same is true when defining a member of an explicitly specialized member class. However, template<> is used in defining a member of an explicitly specialized member class template that is specialized as a class template.

E的顯式特絕對不屬於的顯式特大膽的情況下,它仍然需要template<>。這是爲什麼?

template<class T> struct A { 
    enum E : T; 
}; 

template<> enum A<int>::E : int { eint }; 

回答

5

本段涉及明確專門化的類模板的成員,但是您沒有明確地專門化類模板。這是它在談論情況的一個例子:

template<class T> struct A { 
    enum E : T; 
}; 

template<> struct A<int> { 
    enum E : int; 
}; 

enum A<int>::E : int { eint }; // no template<> here 

在你的示例代碼,您已明確專門的主模板中的一員,這確實需要使用template<>,作爲第一款規定。

1 An explicit specialization of any of the following:

...

(1.7) — member enumeration of a class template

...

can be declared by a declaration introduced by template<>; that is: explicit-specialization: template < > declaration

第5段的基本原則是,一旦你明確專門的模板,它不再是一個模板,你與專業化就像你其他任何非模板實體工作。

+0

我正在談論隱式實例化的類模板特化**成員的顯式特化。此外,你的代碼給我一個錯誤。 – b1sub

+2

@ Il-seobBae:是的,但這不是你從標準中提到的那個段落所談論的。它是在討論一個明確專用的類模板,而不是一個明確專門化的成員,大膽的部分是在討論一個明確專用的成員類模板,這是完全不同的。 –

+0

我不知道你在做什麼。那麼,在這種情況下哪個段落必須存在'template <>'?我的意思是,代碼不屬於你提到的情況,所以它不應該需要'template <>'。 – b1sub