gpt4 book ai didi

c++ 模板和多态性没有合适的用户定义转换

转载 作者:行者123 更新时间:2023-11-30 05:20:13 26 4
gpt4 key购买 nike

无法理解此转换如何(以及为什么)不起作用。

我有 A 类、从 A 类派生的 B 类和从 B 类派生的 C 类。

class A {};
class B : public A {};
class C : public B {};

我想创建一个具有两个模板类型名称的哈希表 <K, V> ,其中 K 是一个字符,V 是一个二叉搜索树模板类 ( BST<T> )。这些 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
};

以下代码在放置 BST<C> 时出错在哈希表中,因为它无法从 BST<C> 转换至 BST<A> .但是,main 中的最后一行是合法的。

int main() {
HashTable<char, BST<A>> inventory;
BST<C> foo;
inventory.put('C', foo);

A *bar= new C();
}

我虽然因为多态性,BST<C>是一个BST<A> ?我如何解决这种类型差异,以便将 BST、BST 和 BST 添加到我的 HashMap 中?

我已经尝试在声明中使用 typedef,但没有用。

最佳答案

转换不会发生。 BST<C>无法转换为 BST<A> ,因为它们是完全不同的、不相关的类。

当模板被实例化时,它看起来像这样(粗略地):

template <>
struct BST_C {
bool insert(C item); // adds item to tree
// ...
};

template <>
struct BST_A {
bool insert(A item); // adds item to tree
// ...
};

如您所见,两者之间没有任何关系。


对此你能做什么?

好吧,您可以定义一个转换运算符,仅限于基类:

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...
}
};

有了那个转换运算符,你的类(class) BST<C>可转换为 BST<B>BST<A>分别。

关于c++ 模板和多态性没有合适的用户定义转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40773489/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com