C++ 使用虚拟_数组失败<;国际,6>;arr();

C++ 使用虚拟_数组失败<;国际,6>;arr();,c++,c++17,C++,C++17,问题是数组的声明 我们可以评论 #include <cstdlib> #include <fstream> #include <iostream> #include <vector> #include <list> template <typename Type, size_t const SIZE> class dummy_array { Type data[SIZE] = {}; public:

问题是数组的声明

我们可以评论

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <vector>
#include <list> 

template <typename Type, size_t const SIZE>
class dummy_array {
    Type data[SIZE] = {};

  public:
    dummy_array(){}
    ~dummy_array(){}

    Type& operator[](size_t const index)
    {
      if (index < SIZE)
        return data[index];
      throw std::out_of_range("index out of range");
    }

    Type const& operator[](size_t const index) const
    {
      if (index < SIZE)
        return data[index];
      throw std::out_of_range("index out of range");
    }

};
int main()
{
    {
      dummy_array<int, 6> arr();
      arr[0] = 1;
      arr[1] = 2;

      for (int i = 0; i < 6; i++)
        std::cout << arr[i] << " " ;
    std::cout << std::endl;

    }
    return 0;
}

main.cpp:34:16:错误:分配只读位置“*arr”

   arr[0] = 1;

            ^
main.cpp:35:12:错误:指向算术[-Wpointer arith]中使用的函数的指针

   arr[1] = 2;

        ^
     std::cout << arr[i] << " " ;

                       ^
main.cpp:35:16:错误:只读位置“*(arr+1)”的分配

main.cpp:38:27:错误:指向算术[-Wpointer arith]中使用的函数的指针

   arr[1] = 2;

        ^
     std::cout << arr[i] << " " ;

                       ^
std::cout
dummy_数组arr();
这可以看作是函数声明或变量声明

编译器总是喜欢函数声明而不是变量声明,因此您实际上声明了一个名为arr的函数,不带任何参数并返回一个伪数组。改用这个:

dummy_数组arr{};
虚拟数组arr();
这可以看作是函数声明或变量声明

编译器总是喜欢函数声明而不是变量声明,因此您实际上声明了一个名为arr的函数,不带任何参数并返回一个伪数组。改用这个:

dummy_数组arr{};

Replace
dummy_array arr()带有
伪数组arr{}或只是
虚拟数组arr,您可能会得到一个警告
空括号,解释为函数声明
,非常感谢。我得到了您的答案,因为编译器将其视为函数,并通过对元素的违犯访问使其失败带有
伪数组arr{}或只是
虚拟数组arr,您可能会得到一个警告
空括号,解释为函数声明
,非常感谢。我得到了你的答案,因为编译器将其视为函数,并通过对元素的访问使其失败;这是一种误解。(你链接的那篇文章确实解释了这一点。)然而,你其余的答案是正确的。哦,它不再解释了。以前是的,我现在没有有效的STL,所以我相信你。该标准的第8.2节确实讨论了声明中的函数样式转换,但当然没有提到“最麻烦的解析”这个名称。我现在处理的麻烦事总是最麻烦的这是一个常见的误解。它源于同样的语言规则,最终有点像。但这不是一个“把戏”,甚至不是一个真正的惊喜;这只是个错误/打字错误。当你写的东西看起来应该是一个对象声明(这不是!),但结果却不是,MVP就出现了;这是一种误解。(你链接的那篇文章确实解释了这一点。)然而,你其余的答案是正确的。哦,它不再解释了。以前是的,我现在没有有效的STL,所以我相信你。该标准的第8.2节确实讨论了声明中的函数样式转换,但当然没有提到“最麻烦的解析”这个名称。我现在处理的麻烦事总是最麻烦的这是一个常见的误解。它源于同样的语言规则,最终有点像。但这不是一个“把戏”,甚至不是一个真正的惊喜;这只是个错误/打字错误。当你写的东西看起来应该是一个对象声明(事实并非如此!)但结果却不是这样时,MVP就出现了。