Я столкнулся с необычной неразрешенной внешней символикой с этим классом. У меня есть библиотека 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-файле, что и остальные определения класса, поэтому он должен быть определен в момент создания экземпляра.
В чем проблема и как ее исправить?
Не могли бы вы прочитать вопрос перед тем, как пометить его как дубликат? Это не проблема метода шаблона, который не определяется в заголовке. Он определен в заголовке. Сам класс не является шаблоном. Внутренний класс не является шаблоном. Символы окружающего класса разрешаются отлично, но символ из внутреннего класса даже не определяется тем, что он определен в одной и той же единице перевода и в библиотеке. – Resurrection
Я, например, прочитал вопрос, и ваша проблема была очевидна после того, как я прочитал следующее утверждение: _Когда я ввел определение в заголовок, он отлично работает. –
@ AlgirdasPreidžius Вы серьезно? Я, очевидно, подразумеваю определение 'SaveFile :: Index :: operator bool() const', а не шаблон. Это определено в заголовке все время. – Resurrection