C++ c++;模板和多态性没有可使用的用户定义转换
无法理解这种转换如何(以及为什么)无法工作 我有A类,B类来自A类,C类来自B类C++ c++;模板和多态性没有可使用的用户定义转换,c++,templates,polymorphism,C++,Templates,Polymorphism,无法理解这种转换如何(以及为什么)无法工作 我有A类,B类来自A类,C类来自B类 class A {}; class B : public A {}; class C : public B {}; 我想制作一个具有两个模板类型名的哈希表,其中K是char,V是二进制搜索树模板类(BST)。这些BST将具有类型名A、B和C template <typename K, typename V> class HashTable { public: bool put(K key, V
class A {};
class B : public A {};
class C : public B {};
我想制作一个具有两个模板类型名的哈希表,其中K是char,V是二进制搜索树模板类(BST
)。这些BST将具有类型名A
、B
和C
template <typename K, typename V>
class HashTable {
public:
bool put(K key, V value); // adds key value pair to table
private:
V* table; // table stores values
int size; // size of table
};
template <typename T>
class BST {
public:
bool insert(T item); // adds item to tree
private:
struct BSTNode { // node structure
R data; // item data
BSTNode *left; // left child pointer
BSTNode *right; // right child pointer
};
BSTNode *root; // pointer to root of tree
};
模板
类哈希表{
公众:
boolput(K键,V值);//将键值对添加到表中
私人:
V*table;//表存储值
int size;//表的大小
};
模板
BST级{
公众:
bool insert(T项);//将项添加到树中
私人:
struct BSTNode{//节点结构
R data;//项数据
BSTNode*left;//左子指针
BSTNode*right;//右子指针
};
BSTNode*root;//指向树根的指针
};
以下代码在将BST
放入哈希表时出错,因为它无法从BST
转换为BST
。然而,主要的最后一行是合法的
int main() {
HashTable<char, BST<A>> inventory;
BST<C> foo;
inventory.put('C', foo);
A *bar= new C();
}
intmain(){
哈希表清单;
BST foo;
存货。卖出价('C',foo);
A*bar=新的C();
}
我认为由于多态性,BST
is-aBST
?如何克服这种类型差异,以便将BST、BST和BST添加到hashmap中
我已经尝试在声明中使用typedef,但没有效果。这是因为即使
B
与a
有is-a关系,BST
也与BST
有无关系。这两个模板实例可能以任何方式相互关联,实际上可能完全不同。这是因为即使B
与a
存在is-a关系,BST
也与BST
存在无关系。这两个模板实例可能以任何方式相互关联,但实际上可能完全不同。转换不可能发生BST
不能转换为BST
,因为它们是完全不同的、不相关的类
当模板实例化时,它的外观如下(大体上):
模板
结构BST_C{
bool insert(C项);//将项添加到树中
// ...
};
模板
结构BST_A{
bool insert(项目);//将项目添加到树中
// ...
};
正如你所看到的,两者之间没有关系
对此你能做些什么 您可以定义一个转换运算符,仅限于基类:
template <typename T>
struct BST {
bool insert(T item);
// only enable for base classes ------------v
template<typename To, std::enable_if_t<std::is_base_of<To, T>>* = nullptr>
operator BST<To> () const {
// implement the conversion operator...
}
};
模板
结构BST{
布尔插入(T项);
//仅对基类启用---------v
模板
运算符BST()常量{
//实现转换运算符。。。
}
};
使用该转换运算符,您的类
BST
可以分别转换为BST
和BST
。转换无法进行BST
不能转换为BST
,因为它们是完全不同的、不相关的类
当模板实例化时,它的外观如下(大体上):
模板
结构BST_C{
bool insert(C项);//将项添加到树中
// ...
};
模板
结构BST_A{
bool insert(项目);//将项目添加到树中
// ...
};
正如你所看到的,两者之间没有关系
对此你能做些什么 您可以定义一个转换运算符,仅限于基类:
template <typename T>
struct BST {
bool insert(T item);
// only enable for base classes ------------v
template<typename To, std::enable_if_t<std::is_base_of<To, T>>* = nullptr>
operator BST<To> () const {
// implement the conversion operator...
}
};
模板
结构BST{
布尔插入(T项);
//仅对基类启用---------v
模板
运算符BST()常量{
//实现转换运算符。。。
}
};
使用该转换运算符,您的类
BST
可以分别转换为BST
和BST
。看起来您正在自定义容器中存储A
,这将切掉子类。等等。。。什么?这是错误的欺骗。相关问题与此无关。投票重新打开。@SamVarshavchik,完全错误的复制。我编辑它是为了让你可以看到鳄鱼括号中的内容,但似乎每个人都理解我的问题。看起来你正在自定义容器中存储A
,这会将子类切掉。等等。。。什么?这是错误的欺骗。相关问题与此无关。投票重新打开。@SamVarshavchik,完全错了。我编辑了它,以便您可以看到鳄鱼括号中的内容,但似乎每个人都理解我的问题。这解决了语法错误,该解释使类型差异非常清楚,谢谢!我将不得不阅读更多关于转换运算符的内容来学习如何实现。这解决了语法错误,并且该解释使类型差异非常清楚,谢谢!我必须阅读更多关于转换运算符的信息才能学习如何实现。