2016-10-01 72 views
1

我已經用模板化方法創建了一個普通類,並且所有方法實例都是顯式的和內聯的。顯式類成員實例化

class MyClass 
{ 
    template<int N> inline void MyMethod(); 
    template<> inline void MyMethod<1>() { cout << 1; } 
    template<> inline void MyMethod<2>() { cout << 2; } 
}; 

我需要使用template<>語法有它編譯。我嘗試了其他的解決方案,比如類聲明之外的方法的顯式定義,以及語法變體,都無濟於事。 (這是VS2008下進行,而不是試圖在以後的版本。)

我有兩個問題:

  • 是這種便攜式?
  • 它有道理嗎?

回答

2

你寫的方式是錯誤的,它不會工作。
會員法特必須把你的類:

class MyClass 
{ 
    template<int N> void MyMethod(); 
}; 

template<> void MyClass::MyMethod<1>() { } 
template<> void MyClass::MyMethod<2>() { } 

它的便攜和是否有意義主要取決於你的實際問題,很難從你的例子說。

+0

值得注意的是,可以將這些模板方法的特化的實現(只要標題包含這些特化的適當聲明)移動到源文件。雖然它不能用未被專門化的方法模板來完成...... –

+0

爲什麼它能夠工作呢? –

+0

@ YvesDaoust其實它[不](https://godbolt.org/g/yEBYVo)[工作](https://godbolt.org/g/GzWrlo)。也許你的編譯器的擴展? – skypjack

1

你不能完全專注於類體中的成員模板。部分專業化是允許的。必須在課堂主體之外聲明/定義完全專業化(如果未聲明inline,應將定義放在cpp文件中)。

作爲參考,這個question

+0

而且由於不能部分地專門化方法(它在語法上被禁止) - 在類內不能定義任何方法專門化...但是我不確定是否嚴格要求定義應該在源文件中,我認爲它是相當一個選項,雖然它不是非專業方法模板的選項... –

+0

很抱歉,我沒有提及內聯 –