- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
无法理解此转换如何(以及为什么)不起作用。
我有 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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!