【发布时间】:2015-04-15 05:18:03
【问题描述】:
假设我有一个类X,私有实现Ximpl:
//Proj.h
#ifdef PROJ_EXPORTS
#define PROJ_API __declspec(dllexport)
#else
#define PROJ_API __declspec(dllimport)
#endif
//X.h
class PROJ_API X
{
void foo();
//..
private:
class Ximpl;
std::unique_ptr<Ximpl> x_impl;
}
这很好用,但会产生警告:
Compiler Warning (level 1) C4251:
警告 C4251: 'X::Ximpl' : 类 'std::unique_ptr>' 需要有 'X::Ximpl' 类的客户端使用的 dll 接口
我已尝试遵循建议的 MSDN 文章,但是 1)。它没有用。 2)我不清楚解决方案(解决方法)
关于如何摆脱这些警告的任何建议/解释(#pragma disable's 不是一个选项 :))。
为什么是 1 级警告?
注意:事实证明,如果Ximpl 未在X 范围内声明,则可以在Ximpl 的前向声明后导出unique_ptr<Ximpl>,但如果它在Xs 范围内,那么它是一个嵌套类,因此不能前向声明..
但是,对于模板类,即使是上述解决方案(具有非嵌套的 impl 类),似乎也失败了:
//X.h
template<typename T>
class PROJ_API X
{
T foo();
//..
private:
class Ximpl;
std::unique_ptr<Ximpl> x_impl;
}
【问题讨论】:
-
你不是说
std::unique_ptr<Ximpl> x_impl;吗? -
@Pradhan 是的,你是对的,已编辑。谢谢!
-
我假设在
class之后和X之前存在直接或宏__declspec(dllexport);正确吗? -
@WhozCraig - 对,已编辑。以及 .cpp 文件中
Ximpl的声明/定义 -
可能的解决方案是从 X 类中删除 PROJ_API 说明符并将其添加到各个 X 方法中。
标签: c++ visual-c++ stl unique-ptr pimpl-idiom