2016-12-06 14 views
0

Я столкнулся с необычной неразрешенной внешней символикой с этим классом. У меня есть библиотека C++ на основе Qt, где LIBDATASHARED_EXPORT является псевдонимом для __declspec(dllexport) или __declspec(dllimport).Неразрешенный внешний символ вложенного класса, используемый в шаблоном методе

class LIBDATASHARED_EXPORT SaveFile 
{ 
    class Index 
    { 
    public: 
     operator bool() const; //<--- defined in cpp 
    }; 

public: 
    template<typename T> load() 
    { 
     Index idx; 

     if(idx) //<--- complains about unresolved symbol... 
     { 

     } 
    } 
}; 

Когда я использую это в другом проекте, где я связываю с библиотекой я получаю unresolved external symbol о SaveFile::Index::operator bool() const при инстанцировании метод шаблона. Когда я помещаю определение SaveFile::Index::operator bool() const в заголовок, он отлично работает. Определение SaveFile::Index::operator bool() const действительно находится в том же .cpp-файле, что и остальные определения класса, поэтому он должен быть определен в момент создания экземпляра.

В чем проблема и как ее исправить?

+0

Не могли бы вы прочитать вопрос перед тем, как пометить его как дубликат? Это не проблема метода шаблона, который не определяется в заголовке. Он определен в заголовке. Сам класс не является шаблоном. Внутренний класс не является шаблоном. Символы окружающего класса разрешаются отлично, но символ из внутреннего класса даже не определяется тем, что он определен в одной и той же единице перевода и в библиотеке. – Resurrection

+0

Я, например, прочитал вопрос, и ваша проблема была очевидна после того, как я прочитал следующее утверждение: _Когда я ввел определение в заголовок, он отлично работает. –

+0

@ AlgirdasPreidžius Вы серьезно? Я, очевидно, подразумеваю определение 'SaveFile :: Index :: operator bool() const', а не шаблон. Это определено в заголовке все время. – Resurrection

ответ

0

Проблема заключается в том, что нужно также экспортировать внутренние классы, поэтому решение в этом случае должно добавить LIBDATASHARED_EXPORT к внутреннему классу, потому что он не экспортируется внешним классом (который сам экспортируется). Обнаружен с помощью Dependency Walker.

 Смежные вопросы

  • Нет связанных вопросов^_^