c++ - 具有跨 DLL/SO 使用的静态数据成员的模板类

标签 c++ templates static export

假设我有这样一个模板类:

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/

相关文章:

c++模板和头文件

c++ - 在每个源文件中替代 "extern template"

c++ - (SFINAEd) 模板函数的宏

c# - 如何从 XAML 中的静态成员引用属性?

c++ - 在 C++ 中使用前向声明的错误

.net - C++ 项目中的 MSVCR80.DLL 引用,VS2005

c++ - 使用 std::cout 时 SerializeToZeroCopyStream 和 SerializeToOstream 有什么区别?

c++ - 临时左值是 std::move 的用例吗

c - 这个 C 代码是什么意思 (G_GNUC_PRINTF)?

php - Sonar 和 PHPMD : how to exclude directories