[英]How do you specialize a templated method with no parameters in a non-templated class?
[英]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.