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