2016-04-25 89 views
1

所以我有一個類想要實例化爲兩個類中的一個。我宣佈它在頭:混合顯式類專業化和類方法專業化?

template <class T> 
class MyClass { 
public: 
    bool DoSomethingGeneric(); 
    bool DoSomethingTSpecific(); 
}; 

因爲我不想把方法定義的頭,我不是將它們放置在實現文件,並進行明確分工。雖然DoSomethingGeneric方法一般使用模板來定義的,DoSomethingTSpecific需要兩個不同的實現,每個爲此我要實例MyClass兩個可能的類:

template <class T> 
bool MyClass<T>::DoSomethingGeneric() { 
    // Generic code 
} 

template <> 
bool MyClass<ClassA>::DoSomethingTSpecific() { 
    // ClassA-specific implementation 
} 

template <> 
bool MyClass<ClassB>::DoSomethingTSpecific() { 
    // ClassB-specific implementation 
} 

現在,謎語我:在哪裏我把明確的專業化?如果我把它放在我的模板定義之後(像我一般用純粹的泛型類的特辦),鐺說:

explicit specialization of 'MyClass<ClassA>' after instantiation 

此消息是伴隨着指針到DoSomethingTSpecific定義行。這是有道理的。我的理解是,DoSomethingTSpecific方法的明確專業化被認爲是一種隱含的專業化。

同時,如果我把該特所有的模板定義後,我看到:

no function template matches function template specialization 'DoSomethingTSpecific' 

這個人是怎樣的一個謎給我的。

有什麼想法?我怎樣纔能有明確的類級專業化和明確的方法專業化?

+1

不能再現https://godbolt.org/g/zAlT8e – sergej

+1

即再現無關的問題。這一個重現它:https://godbolt.org/g/kbcRK3請注意,增加顯式類專業化。移動專業化會重現這兩個錯誤。 – Alex

+0

這個https://godbolt.org/g/umiA5o怎麼樣? – sergej

回答

1

從C++標準§14.7.3(5)顯式專業化重點礦山):以相同的方式作爲成員定義

一個明確專門類模板的成員是 的正常類,不使用template<>語法

實施例:

template <> // specialization for classA 
class MyClass<ClassA> { 
public: 
    bool DoSomethingTSpecific(); // must be declared here 
}; 

// template<> is not used here 
bool MyClass<ClassA>::DoSomethingTSpecific() { 
    // ClassA-specific implementation 
} 

演示:

http://cpp.sh/3tc2g