Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;模板和多态性没有可使用的用户定义转换_C++_Templates_Polymorphism - Fatal编程技术网

C++ c++;模板和多态性没有可使用的用户定义转换

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

无法理解这种转换如何(以及为什么)无法工作

我有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 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-a
BST
?如何克服这种类型差异,以便将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,完全错了。我编辑了它,以便您可以看到鳄鱼括号中的内容,但似乎每个人都理解我的问题。这解决了语法错误,该解释使类型差异非常清楚,谢谢!我将不得不阅读更多关于转换运算符的内容来学习如何实现。这解决了语法错误,并且该解释使类型差异非常清楚,谢谢!我必须阅读更多关于转换运算符的信息才能学习如何实现。