На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> шаблонный класс
    есть шаблонный класс
    ExpandedWrap disabled
      template <class T>
      class SomeClass {
      ...
      }


    хочется реализовать методы в *.cpp файле
    ExpandedWrap disabled
      template <class T>
      void SomeClass<T>::Func (void){
      ...
      }


    но линковщик говорит, что не может найти
    SomeClass<T>::Func()

    как правильно определить метод - и можно ли это сделать вообще в *.cpp файле ?
    Сообщение отредактировано: zss -
      Цитата zss @
      можно ли это сделать вообще в *.cpp файле ?
      Нет. Всё должно быть в хедере.

      Добавлено
      А еще неплохо бы соблюдать Правила и использовать поиск -- обсуждалось неоднократно.
        Не знаю, почему у тебя не работает. У меня все компилируется без ошибок.
        ExpandedWrap disabled
          // template.h
          template <class T>
          class SomeClass {
              void Func();
          };

        ExpandedWrap disabled
          // template.cpp
          #include "template.h"
          template <class T> void SomeClass<T>::Func() {
              return;
          }
          Цитата Red Devil @
          Не знаю, почему у тебя не работает. У меня все компилируется без ошибок.

          хм...

          странно. Ты точно уверен ?
            Цитата Red Devil @
            У меня все компилируется без ошибок.
            А линкуется тоже без ошибок? :)
              Цитата
              Не знаю, почему у тебя не работает. У меня все компилируется без ошибок.

              а если ты используешь SomeClass не в template.cpp разве будет без ошибок?
                Цитата H.Iglesias II @
                а если ты используешь SomeClass не в template.cpp разве будет без ошибок?

                компилятор не проходит по шаблонному коду если он не разу не был упомянут в программе, потому и у
                Red Devil все компилируется. Кстати, вот это тоже будет компилиться на ура, пока не будет явного вызова этой функции

                ExpandedWrap disabled
                  template <class T>
                  void Func( T d )
                  {
                    тут можно писать как угодно ;)
                    допустим так:
                    если компилятор ругается на это предложение то вы не правильно инстанцировали шаблон, правильно надо сделать так то и так то.
                  }
                Сообщение отредактировано: Sazabis -
                  Цитата Sazabis @
                  Кстати, вот это тоже будет компилиться на ура, пока не будет явного вызова этой функции

                  Компилятор имеет право тут заругаться даже без инстацирования шаблона, другое дело, что мало кто из них этим правом пользуется...
                    Цитата Hryak @

                    Компилятор имеет право тут заругаться даже без инстацирования шаблона, другое дело, что мало кто из них этим правом пользуется...

                    если "право", значит можно и ссылочку :rolleyes: ;) А вообще не понятно, как он собственно будет туда заглядывать ?? раз тип неизвестен, то там вообще непонятно как что работать должно.
                      Цитата Sazabis @
                      если "право", значит можно и ссылочку :rolleyes: ;)

                      Можно...
                      Цитата 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:

                      ExpandedWrap disabled
                        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]




                      Цитата
                      А вообще не понятно, как он собственно будет туда заглядывать ?? раз тип неизвестен, то там вообще непонятно как что работать должно.

                      А это проблема компилятора. :)
                        Цитата

                        А линкуется тоже без ошибок?


                        На РСДН в юморе было такое:
                        "Компилируется - работает !"
                        Я именно это и имел в виду.

                        Мне форум почему-то не дает прикрепить ехешник или архив. Поэтому могу только тебе самому предлождить скопилить.

                        ExpandedWrap disabled
                          // ddd.cpp
                          template <class T>
                          class SomeClass {
                          public:
                              char * Func();
                          };

                        ExpandedWrap disabled
                          #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();
                          }
                        Сообщение отредактировано: Red Devil -
                          Цитата Red Devil @
                          Поэтому могу только тебе самому предлождить скопилить

                          Ну так естественно. Ты попробуй main в другой срр вынести.
                          З.Ы. А инклюдить срр - моветон.
                            Как нефиг. Может сами уже будем хоть какие-то варианты проверять ?

                            Цитата

                            З.Ы. А инклюдить срр - моветон.

                            Мне влом было менять расширение, и для убыстрения создания примера я делал тяп-ляп.

                            ExpandedWrap disabled
                              // ddd.cpp
                              template <class T>
                              class SomeClass {
                              public:
                                  char * Func();
                              };


                            ExpandedWrap disabled
                              // dd.cpp
                              #include "ddd.cpp"
                              template <class T> char * SomeClass<T>::Func() {
                                  return "Template function\n";
                              }


                            ExpandedWrap disabled
                              #include <iostream.h>
                              #include <conio.h>
                              #include "dd.cpp"
                              void main() {
                                  SomeClass <int> a;
                                  cout<<a.Func();
                                  getch();
                              }
                              Цитата Guest
                              ExpandedWrap disabled
                                #include "dd.cpp"

                              Т.е. ты не делаешь разницы между .h и .cpp ?
                              Вообще-то, программисты (и вообще, и в данной ветке), говоря ".cpp" - подразумевают "единица трансляции". А единица трансляции (модуль) не получается просто сменой расширения на ".cpp". Так что твой "dd.cpp" - это обычный подключаемый файл, в котором и должно располагаться определение шаблона. Потому у тебя все и работает.

                              С таким же успехом можешь этот "dd.cpp" обозвать "dd.exe" и говорить, что определение шаблона может находиться даже прямо в экзешнике. :lol:
                              Сообщение отредактировано: Hryak -
                                Цитата Guest @
                                Мне влом было менять расширение, и для убыстрения создания примера я делал тяп-ляп.
                                некрасивое не летает!
                                Тяп-ляп понаделаешь, потом сам себе ногу сломаешь.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0517 ]   [ 16 queries used ]   [ Generated: 30.04.24, 20:08 GMT ]