簡體   English   中英

如何為非類型模板類的特化定義聲明之外的方法?

[英]How do I define methods outside of the declaration for my specialization of a non-type template class?

標題是滿口的,但基本上我寫了這樣的東西:

enum EnumType{ValA, ValB};

template<EnumType> class A {};

template<>
class A<ValA>
{
private:
    double param;
public:
    A(double param);
};

template<>
A<ValA>::A(double param)
{
    // Do Stuff
}

當我嘗試編譯它時,我得到:

錯誤:'A <(EnumType)0u> :: A(double)'的template-id'A <>'與任何模板聲明都不匹配

我做錯了嗎?

在網上搜索類似的情況后,我試圖刪除template<> (即使我不明白為什么這會起作用),但后來我得到了

'A <(EnumType)0u> :: A(double)'的多重定義

我想我可以用inline替換template<> (我試過並編譯),但這感覺不是正確的方法(或者如果是,我不明白為什么)。

有人可以向我解釋我寫的內容有什么問題,為什么改變它似乎有效,以及正確的方法是什么?

有人可以向我解釋我寫的內容有什么問題,為什么改變它似乎有效,以及正確的方法是什么?

標准說:

顯式專用類模板的成員以與普通類成員相同的方式定義,而不使用模板<>語法。

因此,在您的情況下,您必須使用:

A<EnumType::ValA>::A(double param)
{
    // Do Stuff
}

沒有template<>完全沒問題。 那是因為你實際上是專門化一個顯式專用類模板的(特殊)成員函數(構造函數)。
coliru上看到它。


如果沒有給出明確的專業化,那將會有所不同。
作為一個最小的工作示例:

enum EnumType{ValA, ValB};

template<EnumType> class A
{
private:
    double param;
public:
    A(double param);
};

template<>
A<EnumType::ValA>::A(double)
{
    // Do Stuff
}

int main() {
    A<EnumType::ValA> a{0.};
}

在這種情況下,在構造函數的定義之前需要template<> ,因為您沒有定義已經專門化的類模板的成員函數的特化。

您在類定義結束時錯過了分號(;)。 非模板成員函數可以這樣定義:

A<ValA>::A(double param) {
    // Do Stuff
}

非正式地,模板參數列表僅在必要時寫入,例如,為了定義類模板的成員函數模板,兩個模板參數列表都應該被寫入

template<class U, class V>
class A{
  template <class T>
  A();
};

template<class U, class V>
template <class T>
A<U, V>::A() {}

函數模板的顯式特化需要一個空的模板參數列表(我猜,這就是你在這里使用的原因),非正式的,因為它告訴編譯器這不是函數重載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM