Шаблон в шаблоне задачи разных типов - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть шаблон класса с именем 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*> не содержат друг друга в качестве объектов, поэтому я считаю, что это должно работать логически, или это только одно из последствий плохого дизайна.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Это должно знать, что Foo для компиляции data->val.Так что просто переместите это на Foo.h

class Foo {
...
};

template<>
inline bool Temp<Foo*>::comp(Foo* data)
{
    return (this -> data -> val < data -> val);
}

Ref: https://gcc.godbolt.org/z/Go0-Zs

0 голосов
/ 11 декабря 2018

Избавьтесь от объявления comp, специализированного с типом Foo в Temp.h и перегрузки operator< в Foo:

class Foo
{
public:
    int val;
    Temp<int> Ti;
    bool operator<(const Foo& f) {
      return val < f.val;
    }
};

Я просто набираю это такнадеюсь, это скомпилируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...