簡體   English   中英

如何專門化非模板類的模板成員函數?

[英]how to specialize templated member functions of non-templated classes?

假設我有一個文件alpha.h:

class Alpha {
public:
    template<typename T> void foo();
};

template<> void Alpha::foo<int>() {}
template<> void Alpha::foo<float>() {}

如果我在多個cpp文件中包含alpha.h並使用GCC 4.4進行編譯,它會抱怨多個對象文件中存在foo<int>foo<float>多個定義。 對我來說很有意義,因此我將最后兩行更改為:

template<> extern void Alpha::foo<int>() {}
template<> extern void Alpha::foo<float>() {}

但是后來海灣合作委員會說:

顯式模板專門化不能具有存儲類

好的...那我應該如何正確地做到這一點? 我擔心C ++首先不允許我嘗試做的事情,在這種情況下,有沒有一種好的習慣用法可以完成相同的事情?

使用內聯關鍵字

template<> inline void Alpha::foo<int>() {}

或者,在單獨的cpp文件中提供實現

您可以轉發聲明以及內聯選項:

// .h
template<> void Alpha::foo<int>();

//.cpp
template<> void Alpha::foo<int>() {}

從ODR的角度來看,完全(明確)專用的模板不再是模板,因此它與相同類型的非模板實體一樣,受到相同的ODR原則的約束。 (我相信該規則有一些例外,但這對於我們的目的已經足夠了)。

就您的情況而言,出於ODR的目的,完全專門的功能模板是普通功能。 因此,作為普通函數,應在頭文件中聲明並在一個且只有一個實現文件中定義

不需要單獨的聲明或內聯鍵。 PF下面的工作代碼。

#include<iostream>

class temp
{
public:
    template <class T>
    T add1(T a, T b)
    {
            return (a + b);
    }
};

template<>
std::string temp::add1<std::string>(std::string aa, std::string bb)
{
    return aa+bb;
}

int main()
{
    temp *tc = new temp();
    std::cout << tc->add1<float>(5.7, 4.5) << std::endl;
    std::cout << tc->add1<std::string>("my ","program") << std::endl;
}

輸出是:

10.2

我的程序

暫無
暫無

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

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