C++ 变量未在范围内声明

Posted

技术标签:

【中文标题】C++ 变量未在范围内声明【英文标题】:C++ Variable not declared in scope 【发布时间】:2017-02-16 22:44:28 【问题描述】:

在将此问题标记为重复之前,请注意我确实查看了this 帖子和网站上的其他类似帖子。我的问题不在于了解变量范围和/或预处理器的工作方式。我已经把那些下来了。

我无法在我的代码中找出这个讨厌的问题。我只是想使用 C++ 对堆栈数据结构进行建模。编译器一直抱怨sizecapacity 没有在这个范围内声明(对于Stack.cpp)。共有三个文件:

堆栈.h 堆栈.cpp Main.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. 【参考方案1】:

我解决了你的问题,修复了一些问题并进行了优化(只是一个建议),所以:

    第一个问题是您模板化了整个类,而不仅仅是单独的函数,其他人之前回答过。所以除了构造函数之外,每个函数都需要使用模板列表。 当您修复第一个问题时,会出现第二个问题,编译器不会编译代码,因为您使用单独的文件进行定义和实现(您不能使用模板类做到这一点 - 至少不是以通常的方式 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&lt;T&gt;。例如,您的 push 声明应如下所示...

 template<typename T>
 void Stack<T>::push(T item)
 // ... etc ...

【讨论】:

以上是关于C++ 变量未在范围内声明的主要内容,如果未能解决你的问题,请参考以下文章

C++ 错误:未在此范围内声明类/对象

C++ Win API 函数'未在此范围内声明'

字符串未在此范围内声明 C++

C++ 错误:“QueryFullProcessImageNameA”未在此范围内声明

c++ 类未在范围内声明 - 从 main 调用

未在此范围内声明(C++ 中的数组)[关闭]