美文网首页
warningC4251问题总结

warningC4251问题总结

作者: 手写的以后 | 来源:发表于2018-11-02 09:10 被阅读0次

问题内容

最近在封装C++程序为dll链接库的过程中,遇到了如下问题:

warning C4251:“Point2Ds::Points2DXY”: 
class“std::vector<PointStruct,std::allocator<_Ty>>”
需要有 dll 接口由 class“Point2Ds”的客户端使用 

其中,PointStruct是定义的结构体,作为vector的对象类型,Points2DXY是定义的一个vector。

该问题是C++中的一个警告,其产生的原因就是在 C++代码中使用了模板类,但是在封装dll导出的过程中没有导出该模板类的对象类型 ,所以会出现上述警告!

解决方案

通过在网上查找问题,发现提供了很多种解决方案,具体可以参考warning:C4251解决方案。自己简单汇总如下:

  1. 忽略该问题,这只是一个警告,不影响程序正常使用,可以无视,但是该方案不在自己考虑范围之内。
#pragma warnind( disable: 4251 )
  1. 定义成为该模板类的指针对象(自己采用的该方法)
class __declspec( dllexport ) Point2Ds
{
public:
std::vector<PointStruct>* Points2DXY;
};
  1. 将该模板类及其依赖类导出
#include <iostream>
#include <vector>

template  class __declspec( dllexport ) std::allocator<int>;
template  class __declspec( dllexport ) std::vector<int, std::allocator<int> >;
template  class __declspec( dllexport ) std::allocator<PointStruct>;
template  class __declspec( dllexport ) std::vector<PointStruct, std::allocator<PointStruct> >;
class __declspec( dllexport ) Test
{
public:
std::vector<PointStruct> Points2DXY;
};

但是使用该方法自己遇到两个问题:(1)导出声明必须定义在全局变量处,不能定义在类中,否则会出现错误,可以error C2252(2)即使自己定义在了全局变量出,警告还是没消除,不知道是否是编译器的问题,自己使用的是vs2015,在x64的Debug下编译的。所以自己没法采用该方法。

4.Impl法

以下是参考的博客给出的例子:

#include <iostream>
#include <vector>
using namespace std;

// 这些放到.h中
class Test_imp;
class __declspec( dllexport ) Test
{
    // 构造函数中初始化 析构中释放m_pImp;
    void test();

public:
    Test_imp* m_pImp;
};

// 这个类放到cpp中去
class  Test_imp
{
public:
    void test(){}
    std::vector<int> m_objCon;
};


// 放到cpp中
void Test::test()
{
m_pImp->test();
}

简单来说,就是再定义一个类,在该类中使用vector,然后在自己封装的类中调用该类!个人觉得该方法也不好(1)需要多定义类,使得原本的程序结构有些杂乱(2)该类是自己需要导出的类的依赖类,如果放在.h文件中,也需要将其导出,否则会报错(3)如果是放在.cpp文件中,代码结构更加不直观简洁。当然以上纯属个人观点,具体没有尝试过,欢迎拍砖!

相关文章

  • warningC4251问题总结

    问题内容 最近在封装C++程序为dll链接库的过程中,遇到了如下问题: 其中,PointStruct是定义的结构体...

  • 问题总结

    蚂蚁金服一面:分布式架构 50分钟 1、个人介绍加项目介绍20分钟 2、微服务架构是什么,它的优缺点? 微服务架构...

  • 问题总结

    每天上午的状态挺好的,一到下午就变样了,不知道为啥,挺迷糊的!看到大家的分享,先把话术内容提高质量先,请大家帮忙看...

  • 问题总结

    1. Mac下使用IDEA创建了一个Maven项目,部署到本地tomcat后,运行总是报404错误。 解决方法:部...

  • 问题总结

    方法嵌套问题 最近遇到需要进行嵌套调出数据,但是如果在里层用外...

  • 问题总结

    1.做项目的时候,把任务明确的分配,不要使用开玩笑的口吻交代任务,很容易造成误解。2.以后写页面,一个流程一个流程...

  • 问题总结

    1.dSYM你是如何分析的?2.多线程有哪几种?你更倾向于哪一种?3.单例弊端?4.如何把异步线程转换成同步任务进...

  • 问题总结

    为什么要用felx? 布局的传统解决方案,基于盒状模型,依赖display属性 +position属性 +floa...

  • 问题总结

    1、在后台添加了两至三个产品模块后,如何在首页显示(注:不是导航栏)。

  • 总结问题

    1、代理和block的区别: 代理优势:代理占用系统资源小,只是存储了一个对象指针,有三个方法以上的话建议使用代理...

网友评论

      本文标题:warningC4251问题总结

      本文链接:https://www.haomeiwen.com/subject/vzkqxqtx.html