Ошибка связывания с определенной функцией, использующей повышение :: вариант - PullRequest
0 голосов
/ 21 мая 2018

У меня возникает ошибка компоновки, которую я не могу понять, и это происходит только с некоторыми разработчиками (может быть, потому что мы используем несколько разных версий библиотек или компиляторов):

undefined reference to `CodeAttributes::AddCodeAttribute(boost::variant<boost::blank, A, B, C > const&)'

Весь вопроскласс и функция довольно просты, но я не могу сделать самостоятельный пример из-за зависимостей от других классов.

Это объявление класса:

class CodeAttributes : public SomeMixinClass<CodeAttributes>
{
public:
   CodeAttributes();
   CodeAttributes(const CodeAttribute& codeAttribute);
   void AddCodeAttribute(const CodeAttribute& codeAttribute);
   CodeAttribute GetCodeAttribute() const;
   // other stuff

Тогдатип CodeAttribute является typedef следующим образом:

typedef boost::variant<boost::blank, A, B, C> CodeAttribute;

И реализация опять довольно проста:

void CodeAttributes::AddCodeAttribute(const CodeAttribute& codeAttribute)
{
   m_CodeAttribute = codeAttribute;
}
CodeAttribute CodeAttributes::GetCodeAttribute() const
{
   return m_CodeAttribute;
}
CodeAttributes::CodeAttributes(const CodeAttribute& codeAttribute)
   : m_CodeAttribute(codeAttribute)
{}
CodeAttributes::CodeAttributes()
   : m_CodeAttribute(boost::blank())
{}

Класс компилируется как статическая библиотека, и я получаюПриведенная выше ошибка связывания при использовании функции из модульных тестов проекта, использующего статическую библиотеку для сборки исполняемой программы.Вызов функции выглядит следующим образом:

CodeAttributesPtr x(new CodeAttributes);
x->AddCodeAttribute(A());

Я не знаю, в чем может быть проблема, но я попробовал следующее:

  • Если я закомментирую вызовс функцией сеттера, она связывается правильно, поэтому, кажется, есть только одна проблемная функция: сеттер.С геттером все в порядке.
  • Так как я немного растерялся, я попытался вызвать функцию как-то иначе, например x->AddCodeAttribute(x->GetCodeAttribute()); или передать boost::blank() или CodeAtrribute(boost::blank()).Он все равно не может соединиться так же.
  • Я мало знаю о библиотеках или объектном коде, но я попытался запустить objdump для объектного кода и статической библиотеки.Я обнаружил, что функция существует, но аргумент CodeAttribute является boost :: variable с аргументами шаблона определения (как и ожидалось), , но , за которым следует множество boost::detail::variant::void_ аргументов, которые не являютсяв typedef.Я не знаю, является ли это просто деталью реализации boost::variant, но похоже, что она того же типа, что и функция получения, так что, вероятно, все в порядке?

Я не знаю, чтоиначе я мог бы посмотреть, в чем и где проблема.

...