首页 > 解决方案 > 不同类型的模板中的模板问题

问题描述

我有一个名为 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.hTemp.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.hFoo.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

错误:“临时”没有命名类型

我试图从中删除#include "Foo.h"Temp.h使用前向声明class Foo;,但它不起作用,因为我在comp函数中使用了类 Foo 的“val”数据成员,它给了我Temp.h

错误:无效使用不完整类型'class Foo'

并尝试从中删除#include "Temp.h"Foo.h并使用前向模板声明代替template<class T> class Temp;,我认为这会起作用,因为我只需要一个对象,所以我只想让编译器知道我有一个名为 Temp 的模板类,但它也没有工作,它给了我Foo.h

错误:字段“Ti”的类型不完整Temp<int>

我应该怎么做才能使这段代码工作? Temp<int>并且Temp<Foo*>不包含彼此作为对象,所以我相信这应该在逻辑上起作用,或者它只是糟糕设计的后果之一。

标签: c++templatespointerscompiler-errors

解决方案


去掉comp带有Fooin类型Temp.h和重载operator<的special 声明Foo

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

我只是在输入这个,所以希望它能编译。


推荐阅读