将'Stack'重新定义为不同类型的符号
Redefinition of 'Stack' as different kind of symbol
我的C++类中的一个模板类练习要求使这两个类工作:
文件 node.h
#ifndef node_h
#define node_h
template<typename T>
class Node
{
private:
friend class Stack;
Node(T value, Node *next);
T value;
Node *next;
};
#endif /* node_h */
和文件堆栈.h
#ifndef stack_h
#define stack_h
#include "node.h"
template<typename T>
class Stack // ERROR HERE!
{
public:
Stack() : top(0) {}
void push(T value);
T pop();
private:
Node<T> *top;
};
template<typename T>
void Stack<T>::push(T value)
{
top = new Node<T>(value, top);
}
template<typename T>
T Stack<T>::pop()
{
T result = top->value;
top = top->next;
return result;
}
#endif /* stack_h */
我得到了编译器抛出的"将'堆栈'重新定义为不同类型的符号"。我知道这与 node.h 文件中将 Stack 声明为友元类有关,但是如果我删除该行,则 Stack 无法访问节点的私有成员。为什么会出现此问题?
而不是
friend class Stack;
你需要
friend class Stack<T>;
为了实际编译它,我还必须添加对Node
上面的Stack
的前向引用。
template<typename U> friend class Stack;
在没有前向引用的情况下工作,但这Stack<char>
成为Node<int>
的朋友,我认为这不是OP的意图。 也许有人可以澄清一下。符合g++ 7.2.0
template<typename T> class Stack;
template<typename T>
class Node
{
private:
friend class Stack<T>;
Node(T value, Node *next);
T value;
Node *next;
};
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 将超出范围的整数分配给有符号字符类型
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 类型的大小与无符号的等效项?
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 应用于无符号类型的一元减号运算符
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 在有符号基础类型枚举的位域上溢出
- C++,概念不适用于无符号整数作为结果类型?
- 函数指针给我"重新声明为不同类型的符号"错误
- 为什么 (-i) 的类型(其中 i 是无符号的 int)仍然是无符号的 int?
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 这种错误的原因是什么:将"功能"重新定义为不同类型的符号
- 为什么C++数组索引值是有符号的,而不是围绕size_t类型构建的(或者我错了)
- 什么是 16 字节有符号整数数据类型?
- 无符号类型和C++
- C++和无符号类型
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- 重写基于模板类型符号的虚拟方法