У меня есть шаблон класса с именем Temp, и у него есть метод, принимающий аргумент того же типа:
#ifndef TEMP_H
#define TEMP_H
template<class T>
class Temp
{
public:
T data;
bool comp(T);
};
template<class T>
bool Temp<T>::comp(T data)
{
return (this -> data < data);
}
#endif // TEMP_H
Теперь я хочу создать объект класса Temp с типом указателя на другой классназывается Foo.
Temp<Foo*> TptrF;
обычно это просто и для метода comp
я могу специализироваться для этого конкретного типа Foo*
, но мне нужно включить файл Foo.h
в Temp.h
:
//Temp.h
#ifndef TEMP_H
#define TEMP_H
#include "Foo.h"
template<class T>
class Temp
{
public:
T data;
bool comp(T);
};
template<class T>
bool Temp<T>::comp(T data)
{
return (this -> data < data);
}
template<>
inline bool Temp<Foo*>::comp(Foo* data)
{
return (this -> data -> val < data -> val);
}
#endif // TEMP_H
но проблема в том, что у класса Foo есть объект типа Temp<int>
, и для этого члена данных в Foo я должен включить файл Temp.h
в Foo.h
:
//Foo.h
#ifndef FOO_H
#define FOO_H
#include "Temp.h"
class Foo
{
public:
int val;
Temp<int> Ti;
};
#endif // FOO_H
это дает мне Foo.h
:
Ошибка: «Temp» не называет тип
Я пытался удалить #include "Foo.h"
изTemp.h
и вместо этого использовать предварительное объявление, например class Foo;
, но оно не сработало, так как я использовал элемент данных 'val' класса Foo в функции comp
, и это дает мне Temp.h
:
ошибка: недопустимое использование неполного типа 'class Foo'
и попытка удалить #include "Temp.h"
из Foo.h
, и мывместо этого, как объявление * шаблона, как template<class T> class Temp;
, я думал, что это будет работать, так как мне просто нужен объект, поэтому я просто хочу, чтобы компилятор знал, что у меня есть класс шаблона с именем Temp, но он также не работал, и это дает мнев Foo.h
:
ошибка: поле 'Ti' имеет неполный тип Temp<int>
Что я должен сделать, чтобы этот код работал?Temp<int>
и Temp<Foo*>
не содержат друг друга в качестве объектов, поэтому я считаю, что это должно работать логически, или это только одно из последствий плохого дизайна.