Ошибка связывания c ++ с константной функцией-членом в классе - PullRequest
0 голосов
/ 04 мая 2018

У меня есть объявление что-то вроде

    class ABC_EXPORT abc
    {
    ....

public:
     xyz foo1(const arg1 a, const arg3 b) const; //defined in cpp file
     xyz foo2(const arg1 a, const arg2 b) const { return foo1(a, convert_to_arg3(b));}
    };

Это встроено в библиотеку DLL, а другой проект вызывает foo2. Я получаю ошибку компоновщика LNK2019: неразрешенный внешний символ. Однако, если я удаляю const из определения foo2, связь разрешается. Может ли кто-нибудь объяснить мне, что здесь происходит? Я на VS2012 на Windows 7

1 Ответ

0 голосов
/ 04 мая 2018

Убедитесь, что сигнатуры функций объявления и определения совпадают. Одна распространенная ошибка - забыть спецификатор const в определении функции. Например,

struct A
{
    void do_foo_const(int a, int b) const;
};

// An incorrect definition.
// Notice the missing 'const' here V
void A::do_foo_const(int a, int b)
{
    ...
}


// correct definition.
void A::do_foo_const(int a, int b) const
{
    ...
}

Это разделение позволяет существующим и неконстантным вариантам функций существовать рядом друг с другом и возвращать разные результаты. Примером стандартной библиотеки C ++, использующей эту функцию, является std::vector<T>::at. Обратите внимание, как константная версия возвращает константную ссылку, но неконстантная версия возвращает неконстантную ссылку.

...