假设有一个模板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/