簡體   English   中英

實例化錯誤后的成員函數模板的專業化,以及成員函數的順序

[英]Specialization of member function template after instantiation error, and order of member functions

以下位代碼無法在gcc 4.5.3上編譯

struct Frobnigator
{
    template<typename T>
    void foo();

    template<typename T>
    void bar(); 
};

template<typename T>
void Frobnigator::bar()
{
}

template<typename T>
void Frobnigator::foo()
{
    bar<T>();
}

template<>      // error
void Frobnigator::foo<bool>()
{
    bar<bool>();
}

template<>
void Frobnigator::bar<bool>()
{
}

int main()
{
}

錯誤消息: specialization of 'void Frobnigator::bar() [with T = bool]' after instantiation 我終於解決了這個問題,因為Frobnigator::bar<bool>()出現在Frobnigator::foo<bool>() 顯然,方法看起來很重要。

那么為什么以下是上面代碼的精簡版,其中bar的專業化出現在泛型版之后,有效嗎?

struct Frobnigator
{
    template<typename T>
    void foo();
};

template<typename T>
void Frobnigator::bar()
{
}

template<>
void Frobnigator::bar<bool>()
{
}

int main()
{
}

您的第一個代碼標准不正確。

n3376 14.7.3 / 6

如果模板,成員模板或類模板的成員被明確專門化, 則應在首次使用該特化之前聲明該特化,這將導致發生隱式實例化 ,在發生此類使用的每個翻譯單元中; 無需診斷。

在您的情況下 - 在顯式特化聲明之前,在foo<bool>使用類型為boolbar函數的隱式實例化是必需的。

顯然,方法看起來很重要。

確實; 就像在C ++中的情況一樣,在聲明它之前你不能使用它,這適用於顯式模板特化以及大多數其他事情。

使用bar<bool> (通過從foo<bool>調用它)而不使用先前的顯式特化聲明會導致從泛型模板實例化該特化(如果尚未實現)。 您至少需要聲明顯式特化以防止這種情況發生。

為什么會這樣,考慮到bar的特化化出現在上面代碼的以下lite版本中的泛型版本之后

第二個例子的不同之處在於根本沒有實例化foo<bool> 問題不在於通用模板(必須是這種情況)之后聲明專門化,而是在專業化已經實例化之后聲明它。

暫無
暫無

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

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