【问题标题】:C++ invalid array<T, N> subscriptC++ 无效数组<T, N> 下标
【发布时间】:2013-12-27 11:54:11
【问题描述】:

我在 C++ 中创建了一个基本的类/结构集合,其中有类 Book(我没有包括在内)和其他一些类,以及 structFixedSizeBookCollection。但是,当使用FSCB 时,它并没有按计划工作:

books.h

template<size_t Size> struct FixedSizeBookCollection : private std::array<const Book*, Size>{
    FixedSizeBookCollection(const char* Name) : name_(Name){}
    void operator+=(const Book& Book)try{
        if((*this).size() > Size){
            std::ostringstream errorMessage;
            errorMessage << "The FixedSizeBookCollection " << name_ << "'s size capacity has been overfilled" << std::endl;
            throw std::exception(errorMessage.str().c_str());
        }
        /* Line 97 - */ (*this).at(currentPos++) = &Book;
    }catch(const std::exception& e){
        std::ostringstream errorMessage;
        errorMessage << e.what() << " - on line (approx.) " << (__LINE__ -3);
        throw std::exception(errorMessage.str().c_str());
    }
private:
    const char* name_;
    int currentPos;
};

而在main.cpp

FixedSizeBookCollection<5> Collection("My Fixed Size Collection");
Collection += MyBook;

但我得到了错误:

Error: invalid array &lt;T, N&gt; subscript on line (approx.) 97

有什么问题?

【问题讨论】:

  • 你必须告诉我们“第 97 行”在哪里
  • clang 编译得很好,除了抛出异常,我必须将基类 std::exception 的抛出更改为具体异常类的抛出,例如 std::runtime_error 或任你选择:en.cppreference.com/w/cpp/error/exception
  • 注意我说的是编译。由于.at 进行边界检查,您还应该按照 ForEver 的回答检查初始化。我只是不能说你是在谈论编译错误还是运行时错误。

标签: c++ arrays class templates struct


【解决方案1】:

您的currentPos 未初始化。它可以有任何价值。将此变量的初始化添加到您的 c-tor 中。

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2013-07-16
    • 2022-01-05
    相关资源
    最近更新 更多