关于 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
微软称是因为类模板成员只有声明没有定义,但是很显然我给了定义。
再看了下 SIngleton
和 A
的定义区别,发现 A
有 __declspec(dllexport)
,而 SIngleton
没有。给 Singleton
类加上 __declspec(dllexport)
,一切解决。
原因是,只给 A 加了 DLL 导出,却没有给 Singleton<A>
加 DLL 导出,所以 Singleton<A>::pInst
没有被导出。
comments powered by Disqus