关于 Visual C++ 里面的 warning C4661

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2015/09/11/warning-c4661-in-visual-c++/

最近写 C++ 类模板时遇到的一个 C4661 warning,记载于此。

问题代码如下:

 1/* test.h */
 2
 3template <class T>
 4
 5class Singleton {
 6
 7protected:
 8
 9    static T* pInst;
10}
11
12class __declspec(dllexport) A: public Singleton<A> {
13
14}
15
16/* test.cc */
17
18#include "test.h"
19
20A* Singleton<A>::pInst = nullptr;
21
22/* xxxx.cc */
23
24#include "test.h"
25
26// Do something...

出现如下警告:

11>  xxxx.cc
21>test.h(42): warning C4661: “A* Singleton<A>::pInst”: 没有为显式模板实例化请求提供适当的定义
31>  test.h(41): note: 参见“Singleton<A>::pInst”的声明

MSDN文档:https://msdn.microsoft.com/zh-cn/library/1k7k17za(v=vs.120).aspx

微软称是因为类模板成员只有声明没有定义,但是很显然我给了定义。

再看了下 SIngletonA 的定义区别,发现 A__declspec(dllexport),而 SIngleton 没有。给 Singleton 类加上 __declspec(dllexport),一切解决。

原因是,只给 A 加了 DLL 导出,却没有给 Singleton<A> 加 DLL 导出,所以 Singleton<A>::pInst 没有被导出。

comments powered by Disqus