Мы получаем странные неразрешенные ошибки связывания символов с тех пор, как мы обновили Visual Studio 2015 до обновления 3. Кто-нибудь еще сталкивался с такими же проблемами?
Что действительно странно, так это то, что boost :: get_pointer - это шаблонный метод, определенный в заголовке boost. Не понимаю, как в таком случае получить неопределенный внешний символ :(.
Вот репродуктор с бустом 1.61 и Python 3.5.1:
#include <vector>
#include <boost/python.hpp>
using namespace boost::python;
class Canard {
public:
Canard() {}
virtual ~Canard() {}
};
BOOST_PYTHON_MODULE(coin)
{
register_ptr_to_python< std::shared_ptr<Canard> >();
}
И ошибка:
Severity Code Description Project File Line
Error LNK2019 unresolved external symbol "class Canard const volatile * __cdecl boost::get_pointer<class Canard const volatile >(class Canard const volatile *)" (??$get_pointer@$$CDVCanard@@@boost@@YAPEDVCanard@@PEDV1@@Z) referenced in function "private: static struct _typeobject * __cdecl boost::python::objects::make_ptr_instance<class Canard,struct boost::python::objects::pointer_holder<class std::shared_ptr<class Canard>,class Canard> >::get_derived_class_object<class Canard>(struct boost::mpl::bool_<1>,class Canard const volatile *)" (??$get_derived_class_object@VCanard@@@?$make_ptr_instance@VCanard@@U?$pointer_holder@V?$shared_ptr@VCanard@@@std@@VCanard@@@objects@python@boost@@@objects@python@boost@@CAPEAU_typeobject@@U?$bool_@$00@mpl@3@PEDVCanard@@@Z) CCMasterKernelPyPy C:\work\dev\builds\internal\Master\SDK\MasterKernelPyPy\main.obj 1
Но как только я удаляю виртуал перед деструктором класса Canard, то он начинает работать .... Кто-нибудь в курсе? Это ошибка Visual Studio?
1 ответ
В обновлении 3 Visual Studio 2015 добавлено множество функций и улучшений (см. Примечания к выпуску https://www.visualstudio.com/news/releasenotes/vs2015-update3-vs#visualcpp). У него также есть некоторые известные проблемы (https://msdn.microsoft.com/vs-knownissues/ vs2015-update3 см. раздел «Передача типов, не похожих на указатели, в uninitialized_copy»).
Чтобы решить вашу проблему, вам необходимо явно указать преобразование в указатель вашего класса:
namespace boost
{
template <>
Canard const volatile * get_pointer<class Canard const volatile >(
class Canard const volatile *c)
{
return c;
}
}
Удачи, охад
Похожие вопросы
Новые вопросы
visual-studio
Используйте этот тег, если у вас есть определенный вопрос о функциях и функциональности Visual Studio. Не используйте этот тег по вопросам, касающимся кода, который просто случился, чтобы написано в Visual Studio. Подумайте о том, чтобы пометить точную область технологии Вашего вопроса Ссылки, а также помечения более конкретной версии Visual Studio. Пожалуйста, укажите вашу точную версию VS, выпуск и уровень обновления в своем вопросе. Не используйте этот тег на вопросы относительно кода VS.
boost/optional.hpp
, потому что перегрузкаget_pointer
каким-то образом пытается создать экземплярboost::optional<volatile const Canard>
. Вы знаете какой-либо другой способ решения этой проблемы?