c++ - 无法将模板子类转换为不同的模板实例

标签 c++ class templates casting

假设有一个模板stack<class T, int maxElements有一个子类 Entry ,这将为堆栈构建链接列表,所以像这样:

template <class T, int maxElements>
class Stack{
private: 
     class Entry{
        friend class Stack;
        T info;
        Entry* next;
     };
     Entry* first;
public:
    template<class U, int n>
    void append(const Stack<U, n>& s){
          if(isEmpty()) first = s.first; /* here is the problem*/
          ....
    }

};

因此,问题出在标记的行中,它是 assigning to 'Stack<char, 100>::Entry *' from incompatible type 'Stack<char, 10>::Entry *const' ,那是因为它正在为每个模板实例化构建一个“类”条目,但关键是条目不依赖于 maxElement参数,所以我想知道是否有办法将此告诉编译器。
到目前为止,我认为可以做到这一点的唯一方法是从模板中取出类,并使自己成为仅基于 T 的模板

PS:我知道我在出现错误的行中共享内存,一次一件事

最佳答案

问题是不同的模板实例化是不同的类型。因此,嵌套类型(在本例中为 Entry)也是不同的类型。

解决方案同样简单:将部件移动到仅取决于类型的(私有(private))基类:

template<typename T>
class StackBase {
protected:
    struct Entry {
        T info;
        Entry* next;
    };
};

然后你从这个基类派生:

template<typename T, int maxElements>
class Stack: private StackBase<T> {
    ...
};

关于c++ - 无法将模板子类转换为不同的模板实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59690246/

相关文章:

c++ - 隐藏的 friend : declarations and definitions

java - 静态变量初始化过程

javascript - 模仿 javascript 类中的静态属性

c++ - 捕获可变参数模板类型?

c++ - 类模板的非模板函数友元

c++ - 当我们尝试使用和不使用虚函数访问向下转换的指针时发生了什么

c++ - 为什么转发引用需要 std::forward

c++ - 理解 Thrust 中的二元谓词

java - 为什么此构造函数中不需要 "this."命令? ( java )

c++ - 请求 Pimpl 框架评论/建议