簡體   English   中英

模板 class 和 static 數據成員在 DLL/SO 中使用

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

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