A>Компиляция проходит, а линковка выдает "unresolved external symbol public: static bool Tester::test..." A>Что я делаю не так?
Если надо, чтобы из другого модуля было видно, то на определение класса повесить __declspec(dllexport/dllimport). Но у вас она ещё и шаблонная, а для таких общего метода не существует. Можно попробывать насоздавать инстанций:
A>Компиляция проходит, а линковка выдает "unresolved external symbol public: static bool Tester::test..."
A>Что я делаю не так?
1) Может ты шаблон вынес в cpp
2) Может node константный
3) может компилятор обрезанный
Но совсем понимаю смысл этого кода? Его куда надо вставлять, туда где функция определена (tester.cpp) или туда, где она вызывается (скажем, main.cpp)?
Впрочем, я попробовал и туда, и туда — не помогла
Да, в начальном сообщении была ошибка. Tester::test() определена в не в объявлении класса, а в tester.cpp, как:
Здравствуйте, anagaf, Вы писали:
A>Здравствуйте, denisko, Вы писали:
D>>1) Может ты шаблон вынес в cpp
A>Да, в начальном сообщении была ошибка. Tester::test() определена в cpp, как:
A>
A>template <class Object> bool Tester::test( Object obj)
A>{
A> return obj != 0;
A>}
A>
A>Ты это имел ввиду? Что криминального в таком определении?
A>Если прописать прямо в h:
A>
Здравствуйте, denisko, Вы писали:
D>Здравствуйте, anagaf, Вы писали:
A>>Ты это имел ввиду? Что криминального в таком определении?
D>Низзя так. используй inl файл если хочешь разделить объявление и релизацию.
Нельзя именно для статических шаблонных функций-членов?
Здравствуйте, anagaf, Вы писали:
A>Здравствуйте, denisko, Вы писали:
D>>Здравствуйте, anagaf, Вы писали:
A>>>Ты это имел ввиду? Что криминального в таком определении?
D>>Низзя так. используй inl файл если хочешь разделить объявление и релизацию.
A>Нельзя именно для статических шаблонных функций-членов?
Для любых шаблонов нельзя, есть костыли типа экспорта, но это жесть.
сделай проще объявление в .h код в .inl в конце h включаешь inl
Здравствуйте, denisko, Вы писали:
D>Здравствуйте, anagaf, Вы писали:
A>>Здравствуйте, denisko, Вы писали:
D>>>Здравствуйте, anagaf, Вы писали:
A>>>>Ты это имел ввиду? Что криминального в таком определении?
D>>>Низзя так. используй inl файл если хочешь разделить объявление и релизацию.
A>>Нельзя именно для статических шаблонных функций-членов? D>Для любых шаблонов нельзя, есть костыли типа экспорта, но это жесть. D>сделай проще объявление в .h код в .inl в конце h включаешь inl
Здравствуйте, denisko, Вы писали:
D>Здравствуйте, hramovnik, Вы писали: H>>Код который я привел прекрасно работает. D>С чего ты это взял ?
С того, что сюда конечно я его писал по памяти, но в рабочем проекте подобный код работает без проблем.
Компилится как студией, так g++.
Подобным образом описаны общие, частично и полностью специализированные шаблоны. Вылетов нет, утечек тоже. Компилятор, компоновщик довольны. Я тоже
Здравствуйте, hramovnik, Вы писали:
H>Здравствуйте, denisko, Вы писали:
D>>Здравствуйте, hramovnik, Вы писали: H>>>Код который я привел прекрасно работает. D>>С чего ты это взял ?
H>С того, что сюда конечно я его писал по памяти, но в рабочем проекте подобный код работает без проблем.
Приведи подобный компилирующийся код.
Здравствуйте, denisko, Вы писали:
D>Здравствуйте, hramovnik, Вы писали:
H>>Здравствуйте, denisko, Вы писали:
D>>>Здравствуйте, hramovnik, Вы писали: H>>>>Код который я привел прекрасно работает. D>>>С чего ты это взял ?
H>>С того, что сюда конечно я его писал по памяти, но в рабочем проекте подобный код работает без проблем. D>Приведи подобный компилирующийся код.
Вот:
(под руку попался частично специализированный шаблон)
//file: .htemplate<class T>
class CSpecificData
: public CData
{
private:
T & data;
/*...*/public:
/*...*/static void SetValue(const std::string &value);
};
//file: .cppvoid CSpecificData<int>::SetValue(const std::string &value)
{
/*...*/
}
Код из рабочего проекта, так что куски повырезал. Если сильно захочется скомпилить, ты уж, если чего не хватает, добавь
не использует костыли и прекрасно работает. H>>Может я чего то не понял?
A>Просто не хочется делать класс Tester шаблонным. Очень сложный шаблон может получиться, функций типа test несколько и у каждой по несколько параметров
Так зачем тогда вообще засовывать функцию в класс?
Просто добавь в заголовочный файл объявление прототипа функции, а реализацию оставь как есть.
Здравствуйте, hramovnik, Вы писали:
H>Код из рабочего проекта, так что куски повырезал. Если сильно захочется скомпилить, ты уж, если чего не хватает, добавь
Какое отношение этот код имеет к проблеме? Предлагаешь автору для любого чиха шаблон специализировать? Генитальное решение.
Здравствуйте, denisko, Вы писали:
D>Здравствуйте, hramovnik, Вы писали:
H>>Код из рабочего проекта, так что куски повырезал. Если сильно захочется скомпилить, ты уж, если чего не хватает, добавь D>Какое отношение этот код имеет к проблеме? Предлагаешь автору для любого чиха шаблон специализировать? Генитальное решение.
Я же написал, что просто он попался под руку. я автору предлагаю не заморачиваться с классами.
A>Но совсем понимаю смысл этого кода? Его куда надо вставлять, туда где функция определена (tester.cpp) или туда, где она вызывается (скажем, main.cpp)?
В tester.cpp. A>Впрочем, я попробовал и туда, и туда — не помогла A>Да, в начальном сообщении была ошибка. Tester::test() определена в не в объявлении класса, а в tester.cpp, как:
И класс и шаблонная функция должны быть опеределёны в h файле. В противном случае линковщик не сможет найти в obj файлах инстанции этой функции.
Пример выше обеспечивает явное инстанцирование, а не инстанцирование по вызову. Если в вашем случае оно не работает значет вы пытаетесь вызвать инстанцию шаблонной функции, которая не инстанцирована в модуле.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]