C++ 变量未在范围内声明
Posted
技术标签:
【中文标题】C++ 变量未在范围内声明【英文标题】:C++ Variable not declared in scope 【发布时间】:2017-02-16 22:44:28 【问题描述】:在将此问题标记为重复之前,请注意我确实查看了this 帖子和网站上的其他类似帖子。我的问题不在于了解变量范围和/或预处理器的工作方式。我已经把那些下来了。
我无法在我的代码中找出这个讨厌的问题。我只是想使用 C++ 对堆栈数据结构进行建模。编译器一直抱怨size
和capacity
没有在这个范围内声明(对于Stack.cpp
)。共有三个文件:
下面是头文件和.cpp文件的sn-ps代码:
Stack.h
#ifndef STACK_H_
#define STACK_H_
#include <iostream>
#include <string>
using namespace std;
template<typename T>
class Stack
public:
Stack();
void push(T item);
T pop();
private:
int size;
const int capacity = 10;
T items[];
;
#endif
Stack.cpp
#include "Stack.h"
using namespace std;
template<typename T>
Stack::Stack() : items[capacity]
size = 0;
template<typename T>
void Stack::push(T item)
if(size == capacity)
cout << "No more room left. Unable to add items.";
else
items[size-1] = item;
size++;
template<typename T>
T Stack::pop()
if(size == 0)
cout << "Stack is empty. There is nothing to remove.";
else
size--;
编译器还奇怪地抱怨“'template class Stack' used without template parameters void Stack::push(T item)”,这没有多大意义,看看我是如何在成员之前使用模板头的功能。
有人可以澄清我做错了什么吗?
【问题讨论】:
***.com/questions/495021/… 将引导您朝着更好的方向前进。模板化的类型名也是 Stack我解决了你的问题,修复了一些问题并进行了优化(只是一个建议),所以:
-
第一个问题是您模板化了整个类,而不仅仅是单独的函数,其他人之前回答过。所以除了构造函数之外,每个函数都需要使用模板列表。
当您修复第一个问题时,会出现第二个问题,编译器不会编译代码,因为您使用单独的文件进行定义和实现(您不能使用模板类做到这一点 - 至少不是以通常的方式 Explanation)。李>
第三个也是最后一个问题出现在 pop 函数中,因为它以这样的方式定义,它必须返回某些内容,而在正文中您不返回任何内容(我的更改只是临时修复)。
固定大小在推送中更改。
现在进行优化:
-
使用命名空间标准删除。 Explanation
已更改容量,用户可设置(至少在堆栈实例化时)。
将 items 数组更改为 std::unique_ptr 智能指针,指向动态创建的数组。
向构造函数添加了成员初始化列表。
代码(Stack.h):
#ifndef STACK_H_
#define STACK_H_
#include <iostream>
#include <memory> // for unique_ptr
//using namespace std; // it is better to not use using namespace, for avoiding of problems in the future
template<typename T>
class Stack
public:
Stack(const unsigned int& capacity = 10); // usually stacks are defined with user settable capacity
void push(T item);
T pop();
private:
unsigned int size;
unsigned int capacity;
std::unique_ptr<T[]> items;
;
// such templated functions (below) cannot be implemented in other file
template<typename T>
Stack<T>::Stack(const unsigned int& capacity) :
capacity(capacity),
items(new T[capacity]),
size(0)
template<typename T>
void Stack<T>::push(T item)
if (size == capacity)
std::cout << "No more room left. Unable to add items." << std::endl;
else
items[size++] = item; // you should put item at index size, after that increase it by one
template<typename T>
T Stack<T>::pop()
// for such defined function you need to return something of type T
if (size == 0)
std::cout << "Stack is empty. There is nothing to remove." << std::endl;
return 0; // maybe return empty object?
else
return items[--size]; // probably return removed object
#endif
代码(main.cpp):
#include "Stack.h"
int main()
Stack<int> stack;
for (int e = 0; e < 11; e++)
stack.push(e);
for (int i = 0; i < 11; i++)
std::cout << stack.pop() << std::endl;
return 0;
希望这会有所帮助。
【讨论】:
【参考方案2】:编译器还奇怪地抱怨“'template class Stack' 不使用模板参数 void Stack::push(T item)"
我认为编译器试图告诉您,在您使用 Stack
的 cpp 文件中,您应该使用 Stack<T>
。例如,您的 push
声明应如下所示...
template<typename T>
void Stack<T>::push(T item)
// ... etc ...
【讨论】:
以上是关于C++ 变量未在范围内声明的主要内容,如果未能解决你的问题,请参考以下文章