c++ - 不同类型的模板中的模板问题
问题描述
我有一个名为 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
:
错误:“临时”没有命名类型
我试图从中删除#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*>
不包含彼此作为对象,所以我相信这应该在逻辑上起作用,或者它只是糟糕设计的后果之一。
解决方案
去掉comp
带有Foo
in类型Temp.h
和重载operator<
的special 声明Foo
:
class Foo
{
public:
int val;
Temp<int> Ti;
bool operator<(const Foo& f) {
return val < f.val;
}
};
我只是在输入这个,所以希望它能编译。
推荐阅读
- mongodb - MongoDB BI 连接器 ODBC 驱动程序 Power BI 新表未显示在架构中
- python - 如何始终在其所在目录执行 PyInstaller / Platypus 编译的 Python 可执行文件
- function - 当作为另一个 ArrayList 中另一个 PSCustomObject 的属性添加时,PowerShell ArrayList 转换为 PSCustomObject
- php - Symfony 级联持久化或合并复制
- javascript - WebCrypto 在 base64 中生成 ECDSA 签名
- spring - Spring AOP 的用例
- symfony - 使用不同的消息流在 symfony 上通过邮戳发送电子邮件
- postgresql - Spring Data Reactive:来自同一应用程序的 Cassandra 和 RDBS
- asp.net-mvc - 尝试使用实体框架方法多次添加到数据库
- python - Matplotlib - 图例标签的特定列