проблема при class Foo: public Base<Foo> в избранное  новое горячее всё    подписка   модер. 
От: kvser 
Дата: 27.05.08 04:35
Здравствуйте!

В примере:

//Base.h
template<class T> struct Subject{};

//Foo.h
#include "Base.h"

struct Foo: public Base<Foo>
{
   // Foo():Base<Foo>(){}; //если раскомментировать, то все окей
   Foo(); //когда реализация в Foo.cpp, то проблема при линковке: Undefined Reference
};

//Foo.cpp
#include "Foo.h"

Foo::Foo():Base<Foo>() //вот здесь Undefined Reference Base<Foo>
{}

//main.cpp
int main()
{
Foo foo;
}
,


Каким образом написать реализацию Foo::Foo в .cpp, чтобы не было ошибки линковки?
Re: проблема при class Foo: public Base<Foo> в избранное  новое    модер. 
От: alzt 
Дата: 27.05.08 05:29
Здравствуйте, kvser, Вы писали:

K>Каким образом написать реализацию Foo::Foo в .cpp, чтобы не было ошибки линковки?


Линкер не знает, что есть такая функция.
Необходимо явно указать какой тип нужен.
здесь хорошая статья на эту тему
Автор(ы): Валерий Лаптев
Дата: 30.10.2004
В этой статье рассказывается о методах отделения реализации шаблона от его интерфейсной части и о том, как можно заставить это работать на популярных компиляторах наподобие MS Visual C++.
Re: проблема при class Foo: public Base<Foo> в избранное  новое    модер. 
От: VoidEx 
Дата: 27.05.08 05:31
Здравствуйте, kvser, Вы писали:

K>Каким образом написать реализацию Foo::Foo в .cpp, чтобы не было ошибки линковки?


1) Точно нет никакого base.cpp?
2) У вас в коде вообще нет Base, Subject только, это он?
3) main.cpp инклудит foo.h?

Если на все вопросы ответ утвердительный, тогда foo.cpp так же неявно инклудит и base.h и имеет полное определение класса base, так что всё должно работать.
У меня работает.
Re[2]: проблема при class Foo: public Base<Foo> в избранное  новое    модер. 
От: kvser 
Дата: 27.05.08 06:16
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, kvser, Вы писали:


K>>Каким образом написать реализацию Foo::Foo в .cpp, чтобы не было ошибки линковки?


VE>1) Точно нет никакого base.cpp?

VE>2) У вас в коде вообще нет Base, Subject только, это он?
VE>3) main.cpp инклудит foo.h?

VE>Если на все вопросы ответ утвердительный, тогда foo.cpp так же неявно инклудит и base.h и имеет полное определение класса base, так что всё должно работать.

VE>У меня работает.


извините, вот поправки

//Base.h
template<class T> struct Base{}; //здесь Base, а не Subject

//Foo.h
#include "Base.h"

struct Foo: public Base<Foo>
{
   // Foo():Base<Foo>(){}; //если раскомментировать, то все окей
   Foo(); //когда реализация в Foo.cpp, то проблема при линковке: Undefined Reference
};

//Foo.cpp
#include "Foo.h"

Foo::Foo():Base<Foo>() //вот здесь Undefined Reference Base<Foo>
{}

//main.cpp
#include "Foo.h" //конечно же инклудим Foo.h
int main()
{
Foo foo;
}
Re[2]: проблема при class Foo: public Base<Foo> в избранное  новое    модер. 
От: kvser 
Дата: 27.05.08 06:47
Здравствуйте, alzt, Вы писали:

A>Здравствуйте, kvser, Вы писали:


K>>Каким образом написать реализацию Foo::Foo в .cpp, чтобы не было ошибки линковки?


A>Линкер не знает, что есть такая функция.

A>Необходимо явно указать какой тип нужен.

вы хотите сказать, что компилятор не сделал инстанцирование? Но ведь в Foo.h все линкуется.
Не линкуется только в Foo.cpp

A>здесь хорошая статья на эту тему
Автор(ы): Валерий Лаптев
Дата: 30.10.2004
В этой статье рассказывается о методах отделения реализации шаблона от его интерфейсной части и о том, как можно заставить это работать на популярных компиляторах наподобие MS Visual C++.


В статье описывается разделение интерфейса и реализации для шаблонных классов.
У меня же нет такой задачи, у меня объявление шаблонного класса вместе с реализацией
полностью находится в одном Base.h файле. (Subject читать как Base: поправка
Автор: kvser
Дата: 27.05.08
)
Re[2]: проблема при class Foo: public Base<Foo> в избранное  новое    модер. 
От: kvser 
Дата: 27.05.08 08:24
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, kvser, Вы писали:


K>>Каким образом написать реализацию Foo::Foo в .cpp, чтобы не было ошибки линковки?


VE>1) Точно нет никакого base.cpp?

VE>2) У вас в коде вообще нет Base, Subject только, это он?
VE>3) main.cpp инклудит foo.h?

VE>Если на все вопросы ответ утвердительный, тогда foo.cpp так же неявно инклудит и base.h и имеет полное определение класса base, так что всё должно работать.

VE>У меня работает.

у меня gcc3.4.6 не компилирует
Re[3]: проблема при class Foo: public Base<Foo> в избранное  новое    модер. 
От: kvser 
Дата: 28.05.08 04:14
Здравствуйте, kvser, Вы писали:

K>у меня gcc3.4.6 не компилирует


gcc4.2 компилирует