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

标签 c++ templates polymorphism

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

我有 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/

相关文章:

c++ - 使用不同的选项为不同的目标构建相同的文件

c++ - [number]-F出现在String的末尾?

c++ - 如何调用在基类中实现纯虚方法的派生类中的模板化方法?

c++ - 强制实例化派生类型而不是基类型

haskell - 关于嵌套 CPS 悬架类型

c++ - 获取 MAC 地址的代码似乎会损坏内存,但仅在 Release 版本中,而不是 Debug 版本中

c++ - 在没有 typedef 的情况下使用指向函数指针的指针?

c++ - 无法推断重载函数的模板参数

c++ - 获取模板参数的成员变量值列表

java - 在没有 switch 语句的情况下反序列化子类。