![](/img/trans.png)
[英]Why is explicit specialization of a class template member function allowed when defined within the class declaration, but not when defined separately?
[英]Why is explicit specialization of a member not allowed without specializing the class?
C ++標准規定如下:
在類模板成員或出現在命名空間作用域中的成員模板的顯式特化聲明中,成員模板及其某些封閉類模板可能保持非專業化,除非聲明不應明確專門化類成員模板封閉類模板也沒有明確專門化 。 (自舊標准以來,C ++ 11和14.7.3 / 18以來的14.7.3 / 16)
這意味着以下是不可能的:
template<typename T>
class foo {
template<typename U>
void bar();
};
template<typename T>
template<>
void foo<T>::bar<some_type>(){
}
已經存在多個與此相關的問題的問題,這些問題或多或少地由“標准如此”來回答。 我真正不明白的是為什么存在這種限制。
感謝JohnB的回答:
在這種情況下,只有一個專門化(例如T=int
),而另一個專門化只有成員(例如U=int
),就不可能決定使用哪種專業化。
skyjpack的另一點:
可能存在沒有成員函數的類專門化。
模板函數在首次使用或專用時實例化。
當您進行部分特化時,您無法實例化函數,因為它仍然是模板函數。 因此,當你進行專業化時,編譯器必須以某種方式理解你已經進行了部分實例化並將其與實例化相匹配,這可能會導致困難。
人們在評論中說,它可能導致歧義,但很多事情都可能導致模棱兩可的事情。 例如,可以考慮重載功能。 如果調用重載函數是不明確的,編譯器會告訴你它。 在這種情況下也一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.