假设有一个模板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',这是因为它为每个模板实例化都构建了一个“类” Entry,但要点是Entry并不取决于maxElement参数,所以我想知道是否有一种方法可以告诉编译器。
到目前为止,我认为可以做到这一点的唯一方法是从模板中取出该类,并使其自身成为仅基于T的模板

PS:我知道我在发生错误的行中共享内存,一次只有一件事

最佳答案

问题在于不同的模板实例化是不同的类型。这样,嵌套类型(在这种情况下为Entry)也就是不同的类型。

解决方案非常简单:将零件移至仅取决于类型的(私有)基类:

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


然后,您从该基类派生:

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

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

10-14 09:27