【发布时间】:2015-02-25 05:13:30
【问题描述】:
我正在尝试使用模板在 C++ 中实现 HashMap(同时了解模板的工作原理)。为此,我需要从参数类型T 调用方法T :: equals()。
这是我需要的简化代码:
template < class T > class Map{
public:
T* [] cells;
replaceIfEquals( int index, T a ){
if( cells[index].equals( a ); ) cells[index] = a;
};
};
假设T 应该是这样的
class Point2D : public Comparable {
public:
virtual bool equals( Object o ){ Point2D p = (Point2D)o; return ( ix == p.ix ) && ( iy == p.iy ); };
};
它是一些更通用类型的子类型(在 Java 中我会使用接口)
class Comparable {
public:
virtual bool equals( Object o ){ return false; };
};
我想我在模板的概念中遗漏了一些非常基本的东西。
【问题讨论】:
-
T可以是任何类,但并非所有类都有方法T.equals( Object o )。那么编译器怎么知道我以后只会使用Comparable类型的类呢? -
编译器只知道何时尝试使用特定 T 实例化模板并检查该 T 是否具有适当的成员函数。
标签: c++ templates inheritance hashmap