簡體   English   中英

VS2008 extern模板

[英]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.

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