假设我有这样一个模板类:
template <class T>
class Queue
{
public:
static int Size;
};
template <class T> int Queue<T>::Size = 0;
然后我在 D.dll 中导出一个函数,使用 Queue 作为参数:
void ChangeQueueSize(Queue<int>& q)
{
q.Size = 100;
}
然后我在 A.exe 中使用这个导出函数:
Queue<int> q;
q.Size = 10;
ChangeQueueSize(q);
int updatedSize = q.Size;
由于Queue类是由2个项目中的类模板生成的,所以实际上有2份代码,还有静态数据成员。
所以在这里调用 ChangeQueueSize 不会真正改变队列大小,它只是更新另一个类的静态成员,它恰好具有相同的类名。
我们能做些什么来解决这个问题?
gcc 中的弱符号是否可以解决这个问题?
非常感谢。
最佳答案
您不能按照您想象的方式将模板放入库中。您只能将实际的实例化类定义放入库中。
模板本质上是一种代码生成工具,只能将生成的代码放入库中。
您可能希望使用显式模板实例化让编译器生成代码,并从 header 中取出静态成员定义:
// 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>;
现在将源文件编译到库中;这将包含静态成员变量的实例 Queue<int>::size
.
请注意,您的消费者将只能通过 T = int
使用您的类的实例因为他们无权访问静态成员(即他们必须提供自己的成员)。
关于c++ - 具有跨 DLL/SO 使用的静态数据成员的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6666280/