[英]template class with static data member used across DLL/SO
假設我有這樣一個模板 class:
template <class T>
class Queue
{
public:
static int Size;
};
template <class T> int Queue<T>::Size = 0;
我在 D.dll 中導出一個 function 使用隊列作為參數:
void ChangeQueueSize(Queue<int>& q)
{
q.Size = 100;
}
然后我在 A.exe 中使用這個導出的 function:
Queue<int> q;
q.Size = 10;
ChangeQueueSize(q);
int updatedSize = q.Size;
由於 Queue class 是從 2 個項目中的 class 模板生成的,因此實際上有 2 份代碼,以及 static 數據成員。
所以在這里調用 ChangeQueueSize 並不會真正改變隊列大小,它只是更新另一個類的 static 成員,該成員恰好具有相同的 class 名稱。
我們能做些什么來解決這個問題?
gcc 中的弱符號能夠解決這個問題嗎?
非常感謝。
您不能以您可能認為的方式將模板放入庫中。 您只能將實際的、實例化的 class 定義放入庫中。
模板本質上是一個代碼生成工具,你只能將生成的代碼放入庫中。
您可能希望使用顯式模板實例化來使編譯器生成代碼,並從 header中取出static 成員定義:
// Header, shipped to clients
template <class T>
class Queue
{
public:
static int Size;
};
// Library source code:
template <typename T> int Queue<T>::size = 0;
template class Queue<int>;
現在將源文件編譯到庫中; 這將包含 static 成員變量Queue<int>::size
的實例。
請注意,您的消費者將只能使用T = int
的 class 的實例,因為否則他們無權訪問 static 成員(即他們必須提供自己的成員)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.