Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.251.22] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
есть шаблонный класс
template <class T> class SomeClass { ... } хочется реализовать методы в *.cpp файле template <class T> void SomeClass<T>::Func (void){ ... } но линковщик говорит, что не может найти SomeClass<T>::Func() как правильно определить метод - и можно ли это сделать вообще в *.cpp файле ? |
Сообщ.
#2
,
|
|
|
Цитата zss @ Нет. Всё должно быть в хедере. можно ли это сделать вообще в *.cpp файле ? Добавлено А еще неплохо бы соблюдать Правила и использовать поиск -- обсуждалось неоднократно. |
Сообщ.
#3
,
|
|
|
Не знаю, почему у тебя не работает. У меня все компилируется без ошибок.
// template.h template <class T> class SomeClass { void Func(); }; // template.cpp #include "template.h" template <class T> void SomeClass<T>::Func() { return; } |
Сообщ.
#4
,
|
|
|
Цитата Red Devil @ Не знаю, почему у тебя не работает. У меня все компилируется без ошибок. хм... странно. Ты точно уверен ? |
Сообщ.
#5
,
|
|
|
Цитата Red Devil @ А линкуется тоже без ошибок? У меня все компилируется без ошибок. |
Сообщ.
#6
,
|
|
|
Цитата Не знаю, почему у тебя не работает. У меня все компилируется без ошибок. а если ты используешь SomeClass не в template.cpp разве будет без ошибок? |
Сообщ.
#7
,
|
|
|
Цитата H.Iglesias II @ а если ты используешь SomeClass не в template.cpp разве будет без ошибок? компилятор не проходит по шаблонному коду если он не разу не был упомянут в программе, потому и у Red Devil все компилируется. Кстати, вот это тоже будет компилиться на ура, пока не будет явного вызова этой функции template <class T> void Func( T d ) { тут можно писать как угодно ;) допустим так: если компилятор ругается на это предложение то вы не правильно инстанцировали шаблон, правильно надо сделать так то и так то. } |
Сообщ.
#8
,
|
|
|
Цитата Sazabis @ Кстати, вот это тоже будет компилиться на ура, пока не будет явного вызова этой функции Компилятор имеет право тут заругаться даже без инстацирования шаблона, другое дело, что мало кто из них этим правом пользуется... |
Сообщ.
#9
,
|
|
|
Цитата Hryak @ Компилятор имеет право тут заругаться даже без инстацирования шаблона, другое дело, что мало кто из них этим правом пользуется... если "право", значит можно и ссылочку А вообще не понятно, как он собственно будет туда заглядывать ?? раз тип неизвестен, то там вообще непонятно как что работать должно. |
Сообщ.
#10
,
|
|
|
Цитата Sazabis @ если "право", значит можно и ссылочку Можно... Цитата 14.6 -7- Knowing which names are type names allows the syntax of every template definition to be checked. No diagnostic shall be issued for a template definition for which a valid specialization can be generated. If no valid specialization can be generated for a template definition, and that template is not instantiated, the template definition is ill-formed, no diagnostic required. [Note: if a template is instantiated, errors will be diagnosed according to the other rules in this Standard. Exactly when these errors are diagnosed is a quality of implementation issue. ] [Example: int j; template<class T> class X { // ... void f(T t, int i, char* p) { t = i; // diagnosed if X::f is instantiated // and the assignment to t is an error p = i; // may be diagnosed even if X::f is // not instantiated p = j; // may be diagnosed even if X::f is // not instantiated } void g(T t) { +; // may be diagnosed even if X::g is // not instantiated } }; --- end example] Цитата А вообще не понятно, как он собственно будет туда заглядывать ?? раз тип неизвестен, то там вообще непонятно как что работать должно. А это проблема компилятора. |
Сообщ.
#11
,
|
|
|
Цитата А линкуется тоже без ошибок? На РСДН в юморе было такое: "Компилируется - работает !" Я именно это и имел в виду. Мне форум почему-то не дает прикрепить ехешник или архив. Поэтому могу только тебе самому предлождить скопилить. // ddd.cpp template <class T> class SomeClass { public: char * Func(); }; #include <iostream.h> #include <conio.h> #include "ddd.cpp" template <class T> char * SomeClass<T>::Func() { return "Template function\n"; } void main() { SomeClass <int> a; cout<<a.Func(); getch(); } |
Сообщ.
#12
,
|
|
|
Цитата Red Devil @ Поэтому могу только тебе самому предлождить скопилить Ну так естественно. Ты попробуй main в другой срр вынести. З.Ы. А инклюдить срр - моветон. |
Сообщ.
#13
,
|
|
|
Как нефиг. Может сами уже будем хоть какие-то варианты проверять ?
Цитата З.Ы. А инклюдить срр - моветон. Мне влом было менять расширение, и для убыстрения создания примера я делал тяп-ляп. // ddd.cpp template <class T> class SomeClass { public: char * Func(); }; // dd.cpp #include "ddd.cpp" template <class T> char * SomeClass<T>::Func() { return "Template function\n"; } #include <iostream.h> #include <conio.h> #include "dd.cpp" void main() { SomeClass <int> a; cout<<a.Func(); getch(); } |
Сообщ.
#14
,
|
|
|
Цитата Guest #include "dd.cpp" Т.е. ты не делаешь разницы между .h и .cpp ? Вообще-то, программисты (и вообще, и в данной ветке), говоря ".cpp" - подразумевают "единица трансляции". А единица трансляции (модуль) не получается просто сменой расширения на ".cpp". Так что твой "dd.cpp" - это обычный подключаемый файл, в котором и должно располагаться определение шаблона. Потому у тебя все и работает. С таким же успехом можешь этот "dd.cpp" обозвать "dd.exe" и говорить, что определение шаблона может находиться даже прямо в экзешнике. |
Сообщ.
#15
,
|
|
|
Цитата Guest @ некрасивое не летает!Мне влом было менять расширение, и для убыстрения создания примера я делал тяп-ляп. Тяп-ляп понаделаешь, потом сам себе ногу сломаешь. |