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

时间:2017-02-16 22:44:28

标签: c++11 compiler-errors

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

我在代码中无法弄清楚这个讨厌的问题。我只是想用C ++建模堆栈数据结构。编译器一直抱怨sizecapacity未在此范围内声明(Stack.cpp)。有三个文件:

  • Stack.h
  • Stack.cpp
  • Main.cpp的

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

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--; 
    }
}

编译器也奇怪地抱怨“'模板类Stack'没有模板参数使用void Stack :: push(T item)”,这没有多大意义,看我是怎么在成员之前使用模板头的功能

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

2 个答案:

答案 0 :(得分:1)

我解决了你的问题,解决了一些问题并进行了优化(只是推荐),所以:

  1. 第一个问题是你模仿全班不只是单独的功能,其他人先回答。所以你需要在构造函数之外的每个函数中使用模板列表。
  2. 当您修复第一个问题时,会发生第二个问题,编译器不会编译代码,因为您使用单独的文件进行定义和实现(您不能使用模板化的类 - 至少不是通常的方式Explanation)。
  3. 第三个也是最后一个问题出现在pop函数中,因为它是以这种方式定义的,它必须返回一些东西,而且你不会返回任何内容(我的更改只是临时修复)。
  4. 固定大小在推送中更改。
  5. 现在进行优化:

    1. 使用命名空间std删除。 Explanation
    2. 更改了用户可设置的容量(至少在堆栈实例化时)。
    3. 将items数组更改为指向动态创建的数组的std :: unique_ptr智能指针。
    4. 向构造函数添加了成员​​初始值设定项列表。
    5. 代码(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;
      }
      

      希望这有帮助。

答案 1 :(得分:0)

  

编译器也奇怪地抱怨“'模板类Stack'   没有模板参数使用void Stack :: push(T item)“

我认为编译器试图告诉您在cpp文件中使用了Stack,您应该使用Stack<T>。例如,您的push声明应如下所示......

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