[英]VS2008 extern templates
Microsoft有一個擴展 ,可以聲明模板實例化是外部的; 因此,它不會被隱式實例化。 至少那是理論。 我嘗試用代碼再現它
#include <vector>
class Foo{
int i;
public:
virtual ~Foo();
};
extern template class std::vector<Foo>;
這給了我
warning C4231: nonstandard extension used : 'extern' before template
explicit instantiation
然而,似乎沒有其他事情發生:程序繼續鏈接find,即使我使用push_back(並且dumpbin顯示push_back被實例化)。
只有當我宣布
extern template void std::vector<Foo>::push_back(const Foo&);
我按預期得到鏈接器錯誤。
那么:我如何將整個實例化(所有成員)聲明為顯式,以防止隱式實例化?
我認為你在擴展的文檔中被這個注釋所困擾:
專業化中的extern關鍵字僅適用於在類主體外部定義的成員函數。 在類聲明中定義的函數被視為內聯函數,並且始終被實例化。
vector::push_back()
(以及大多數或所有std :: vector <>模板)在類聲明中定義。
鑒於注釋所說的內容,成員函數上的extern
似乎仍然會導致實例化,但是對於此擴展未充分記錄或未明確指定也不會感到驚訝。
我懷疑如果不對每個成員函數執行顯式extern
,你將無法做你想做的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.