Мы получаем странные неразрешенные ошибки связывания символов с тех пор, как мы обновили 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?

8
CanardMoussant 8 Июл 2016 в 10:51

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;
    }
}

Удачи, охад

9
Dewfy 17 Авг 2016 в 14:25
2
ошибка была зарегистрирована для этой проблемы в системе отслеживания ошибок Visual Studio, и перечисляет обходной путь, аналогичный предложенному Охадом. Вы можете отслеживать статус ошибки и комментарии на случай, если исправление компилятора будет добавлено в следующем обновлении Visual Studio.
 – 
TaylorP
14 Июл 2016 в 18:14
Спасибо за обходной путь. Я не мог заставить его работать для абстрактных классов, когда есть включение в boost/optional.hpp, потому что перегрузка get_pointer каким-то образом пытается создать экземпляр boost::optional<volatile const Canard>. Вы знаете какой-либо другой способ решения этой проблемы?
 – 
e.tadeu
21 Мар 2017 в 17:30