gpt4 book ai didi

c++11 - C++ 变量未在范围内声明

转载 作者:行者123 更新时间:2023-12-02 10:45:14 25 4
gpt4 key购买 nike

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

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

  • 堆栈.h
  • 堆栈.cpp
  • Main.cpp

  • 下面是头文件和 .cpp 文件的代码片段:

    堆栈.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

    堆栈.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)”,这没有多大意义,看看我是如何在成员函数之前使用模板头的。

    有人可以澄清我做错了什么吗?

    最佳答案

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

  • 第一个问题是您模板化了整个类,而不仅仅是单独的函数,其他人之前回答过。因此,除了构造函数之外,您需要对每个函数使用模板列表。
  • 当您修复第一个问题时,会出现第二个问题,编译器不会编译代码,因为您使用单独的文件进行定义和实现(您不能使用模板类来做到这一点 - 至少不是以通常的方式 Explanation )。
  • 第三个也是最后一个问题出现在 pop 函数中,因为它是以这种方式定义的,它必须返回一些东西,而在正文中你不返回任何东西(我的更改只是临时修复)。
  • 固定大小在推送中发生变化。

  • 现在优化:
  • 使用命名空间标准删除。 Explanation
  • 更改了用户可设置的容量(至少在堆栈实例化时)。
  • 将 items 数组更改为 std::unique_ptr 智能指针,指向动态创建的数组。
  • 向构造函数添加了成员​​初始值设定项列表。

  • 代码(堆栈.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;
    }

    希望这可以帮助。

    关于c++11 - C++ 变量未在范围内声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286108/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com