c++模版类静态成员引起的怪异问题(跟DLL导出相关),高分相送啊!

jay0518 2014-04-21 05:17:13
hi 各位论坛大小牛:
我今天遇到一个问题,能力有限,解决不了,望各位相助,再次谢谢啦(并高分相送)!
问题描述:
在一个新建的a.DLL工程中,谢了个模版类,头文件内容如下:
//a.h

#pragma once
template <class T>
class Singleton
{
public:
typedef SingleTon<T> Myself;
static MySelf* GetInstance(){
if(instance_ == NULL){
instance_ = new MySelf();
}
return instance_;
}
private:
static MySelf* instance_;
}
template <class T>
SingleTon<T>* SingleTon<T>::instance_ = NULL;
typedef SingleTon<int> IntSingleTon;

此DLL工程中,还有另外一个源码文件,test.h, test.cpp 内含有一个简单的导出函数作为测试:
代码如下:

//test.h
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif
TEST_API void PrintTest();


#include "test.h"
#include <stdio.h>
#include "a.h"
TEST_API void PrintTest()
{
printf("IntSington Addr: %p\r\n", IntSingleTon::GetInstance() );
}

以上都是工程DLL中的源码文件,为了测试我又新建了一个Application Console 工程测试,测试代码如下:

#include <stdio.h>
#include "test.h"
int main()
{
PrintTest();
printf("In Exe IntSingleTon Addr:%p\r\n", IntSingleTon::GetInstance() );
return 0;
}

引入DLL关联,编译,运行后,测试结果出乎我的意料:
PrintTest()打印的地址与后面打印语句 打印出两个不同的对象地址。
奇怪了! 急等帮忙! 谢了!



...全文
278 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
j8daxue 2014-04-22
  • 打赏
  • 举报
回复
如果这个类不是模板类则链接不过,在main.cpp所在工程中找不到这些符号,因为它们都是外部的。 由于是不同的模块,且没指明是导出类, 所以在main编译时认为是内部符号,会把这个模板类实例化一下,这个类所有定义都找得到,所以main.cpp所在工程可以链接过。
jay0518 2014-04-21
  • 打赏
  • 举报
回复
to 林老板: 受教了!我之前还真不知道有这种说法,学艺不精啊,还需努力!
taodm 2014-04-21
  • 打赏
  • 举报
回复
珍惜生命,远离扩展dll,只使用纯C接口的标准dll
carylin 2014-04-21
  • 打赏
  • 举报
回复
神仙你也会犯这个错误。 若要导出DLL中类的静态变量,类必须以_declspec(dllimport)方式声明。这里的Singleton类模板没有导出声明,所以其静态变量instance_无法导出,也就是instance_实例在dll和main所在进程中各有一份。
赵4老师 2014-04-21
  • 打赏
  • 举报
回复
《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》
内容概要:本文围绕发光太阳聚光器开展蒙特卡洛光线追踪研究,重点利用Matlab编程实现光线在聚光系统中的传播路径模拟。通过蒙特卡洛方法对大量随机光线进行统计追踪,精确分析光能在接收面上的分布特性、聚焦效率及系统整体光学性能,进而评估不同几何结构与材料参数对聚光效果的影响,为高效太阳能收集系统的设计与优化提供理论依据和技术支持。研究不仅涵盖核心算法实现,还结合多个跨领域科研案例(如电力系统、路径规划、信号处理、机器学习等),展示了Matlab/Simulink在科研建模与仿真中的广泛应用价值,突出了算法仿真与多学科交叉融合的重要性。; 适合人群:具备一定Matlab编程基础,从事光学工程、新能源技术、仿真建模及相关领域研究的科研人员,尤其适合研究生及青年研究人员。; 使用场景及目标:①掌握蒙特卡洛方法在光学系统仿真中的原理与应用;②学习使用Matlab实现光线发射、反射、折射及能量统计的完整追踪流程;③通过实际代码实践优化聚光器结构设计;④借鉴文中多领域仿真案例,拓展科研视野与技术迁移能力; 阅读建议:此资源以代码实现为核心,建议读者结合Matlab环境动手运行与调试程序,重点关注光线追踪的物理建模与数值计算细节,并参照其他仿真范例举一反三,全面提升科研建模与算法实现能力。
内容概要:本文复现并深入探讨了一种基于价格弹性矩阵的居民峰谷分时电价激励策略,属于电力系统需求响应领域的关键技术研究。研究通过构建价格弹性矩阵精确刻画居民用户对不同时段电价变化的用电行为响应特性,结合优化算法设计科学合理的峰谷分时电价方案,有效引导用户在高峰时段减少用电、低谷时段增加用电,实现削峰填谷,提升电网运行稳定性与能源利用效率。文中配套提供了完整的Matlab代码实现,涵盖数据处理、模型构建、优化求解及结果可视化等模块,具有较强的可复现性与工程应用价值,适用于需求侧管理政策仿真与学术研究。; 适合人群:面向具备一定电力系统基础知识、能源经济学或需求响应研究背景的科研人员,以及从事相关课题的硕士、博士研究生;熟悉Matlab编程且关注智能电网优化的技术人员亦可从中获益。; 使用场景及目标:①用于居民侧用电行为建模与电价敏感性分析;②支撑峰谷电价政策的设计、仿真评估与优化调整;③作为高校教学中需求响应机制的算法实现案例与科研入门实践项目。; 阅读建议:建议读者结合Matlab代码逐模块解析其实现逻辑,重点掌握价格弹性矩阵的构造方法、目标函数与约束条件的数学建模过程,以及优化求解器的调用方式,同时可尝试引入其他智能优化算法进行对比实验,以深化对电价激励机制设计原理的理解与创新能力。

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧