【发布时间】:2013-12-28 16:50:48
【问题描述】:
各位程序员们好,
我正在创建一个 C++ DLL 库,我在其中使用了 boost 的 (1.55) shared_ptr。 但是,当我使用 Visual Studio 2013 编译项目时,会出现一堆疯狂的错误 C2562:
Error 1 error C2562: 'boost::shared_ptr<MEngine::i18n::ITranslationSource>::operator []' : 'void' function returning a value f:\developer\cplus\lib\boost_1_55_0\boost\smart_ptr\shared_ptr.hpp 663 1 MEngine
Error 2 error C2562: 'boost::shared_ptr<MEngine::i18n::ITranslationSource>::operator []' : 'void' function returning a value f:\developer\cplus\lib\boost_1_55_0\boost\smart_ptr\shared_ptr.hpp 663 1 MEngine
Error 3 error C2562: 'boost::shared_ptr<MEngine::Object::GameObject>::operator []' : 'void' function returning a value f:\developer\cplus\lib\boost_1_55_0\boost\smart_ptr\shared_ptr.hpp 663 1 MEngine
Error 4 error C2562: 'boost::shared_ptr<MEngine::Object::GameObject>::operator []' : 'void' function returning a value f:\developer\cplus\lib\boost_1_55_0\boost\smart_ptr\shared_ptr.hpp 663 1 MEngine
Error 5 error C2562: 'boost::shared_ptr<MEngine::Object::GameObject>::operator []' : 'void' function returning a value f:\developer\cplus\lib\boost_1_55_0\boost\smart_ptr\shared_ptr.hpp 663 1 MEngine
Error 6 error C2562: 'boost::shared_ptr<MEngine::i18n::ITranslationSource>::operator []' : 'void' function returning a value f:\developer\cplus\lib\boost_1_55_0\boost\smart_ptr\shared_ptr.hpp 663 1 MEngine
Error 7 error C2562: 'boost::shared_ptr<MEngine::i18n::ITranslationSource>::operator []' : 'void' function returning a value f:\developer\cplus\lib\boost_1_55_0\boost\smart_ptr\shared_ptr.hpp 663 1 MEngine
Error 8 error C2562: 'boost::shared_ptr<MEngine::i18n::ITranslationSource>::operator []' : 'void' function returning a value f:\developer\cplus\lib\boost_1_55_0\boost\smart_ptr\shared_ptr.hpp 663 1 MEngine
如您所见,每个 shared_ptr 模板实例化都有相同的错误。 问题是我从不使用那个运算符,所以不应该不生成它的代码吗?
在这种情况下,为什么会出现该错误是完全可以理解的,因为在 shared_ptr.h 中有这样的:
typename boost::detail::sp_array_access< T >::type operator[] ( std::ptrdiff_t i ) const
{
BOOST_ASSERT( px != 0 );
BOOST_ASSERT( i >= 0 && ( i < boost::detail::sp_extent< T >::value || boost::detail::sp_extent< T >::value == 0 ) );
return px[ i ];
}
还有:
template< class T > struct sp_array_access
{
typedef void type;
};
...
template< class T > struct sp_array_access< T[] >
{
typedef T & type;
};
...
这意味着对于 smart_ptr
所以真正的问题是(我认为)操作符的代码是生成的,但它不应该生成。 我需要将 shared_ptr 导出到我的 DLL 接口,因为它是一个模板,所以我使用它来实例化和导出它:
EXPIMP_TEMPLATE template class MENGINE_API boost::shared_ptr<MEngine::i18n::ITranslationSource>;
宏在哪里(非常标准):
#ifdef MENGINE_EXPORTS
#define MENGINE_API _declspec(dllexport)
#define EXPIMP_TEMPLATE
#else
#define MENGINE_API _declspec(dllimport)
#define EXPIMP_TEMPLATE extern
#endif
我使用的导出语句是否会导致模板中所有内容的生成? 如果这是真的,那么我该如何克服这一点并实现出口?
为我的英语道歉 :) 也非常感谢纠正我,因为我愿意学习:)
【问题讨论】:
-
模板类不应该是公共 Dll 接口的一部分。
-
我承认后果,并且该库旨在用于完全控制工具链以及包含的标头和链接库的版本的环境。我实际上是在发布源代码。
标签: c++ windows visual-studio boost dll