【问题标题】:Warning "C++ requires a type specifier for all declaration" map警告“C++ 需要所有声明的类型说明符”映射
【发布时间】:2018-01-09 02:28:41
【问题描述】:

我在 xcode 中运行此代码。为什么我的编译器一直抱怨映射分配

#include <iostream>
#include <map>
#include <deque>
using namespace std;

map<int,deque<int>> bucket;
deque<int> A{3,2,1};
deque<int> B;
deque<int> C;


bucket[1] = A;//Warning "C++ requires a type specifier for all declaration
bucket[2] = B;//Warning "C++ requires a type specifier for all declaration
bucket[3] = C;//Warning "C++ requires a type specifier for all declaration

int main() {

    for (auto it:bucket)
    {
        cout << it.first << "::";
        for (auto di = it.second.begin(); di != it.second.end(); di++)
        {
            cout << "=>" << *di;
        }
        cout << endl;
    }

    return 0;
}

好像我在 main 里面做同样的事情一样完美

#include <iostream>
#include <map>
#include <deque>
using namespace std;

map<int,deque<int>> bucket;
deque<int> A{3,2,1};
deque<int> B;
deque<int> C;  

int main() {

    bucket[1] = A;
    bucket[2] = B;
    bucket[3] = C;

    for (auto it:bucket)
    {
        cout << it.first << "::";
        for (auto di = it.second.begin(); di != it.second.end(); di++)
        {
            cout << "=>" << *di;
        }
        cout << endl;
    }

    return 0;
}

输出

1::=>3=>2=>1
2::
3::
Program ended with exit code: 0

这是我遗漏的东西吗?无法理解这种行为。 任何建议、帮助或文档。我查看了类似的问题,但没有得到满意的答案

【问题讨论】:

  • 在 C++ 中确实没有函数之外的可执行代码。
  • 双端队列 A{3,2,1};为什么这行得通?
  • 因为那是一个变量的声明。这就是“可执行代码”的概念变得有点模糊的地方。全局变量调用了它的构造函数,在这种情况下,它是初始化列表构造函数。

标签: c++ dictionary stl deque


【解决方案1】:

你不能在全局范围内做这样的事情

int i;
i = 100;

因为在 C++11 中,您可以在声明时初始化值

int i = 100;

或在函数内设置值

int main() {
 i = 100;
}

STL 初始化也是如此,这就是您的问题的原因

【讨论】:

  • bucket[1] = deque A{3,2,1};以上方法可行吗?
  • @HariomSingh 将bucket 的定义移动到deques 之后,然后你可以使用map&lt;int,deque&lt;int&gt;&gt; bucket{{1, A}, {2, B}, ...}; 如果你将赋值和初始化结合起来,一切都很好。
【解决方案2】:

那是因为三行……

bucket[1] = A;//Warning "C++ requires a type specifier for all declaration
bucket[2] = B;//Warning "C++ requires a type specifier for all declaration
bucket[3] = C;//Warning "C++ requires a type specifier for all declaration

是陈述。您不能在 C 中的函数之外执行语句(C 不是 Python)。如果你在 main() 中移动这三行代码,那么它应该可以正常工作。

【讨论】:

    【解决方案3】:

    在函数范围之外初始化变量的方法是

    std::deque<int> A{3,2,1};
    std::deque<int> B;
    std::deque<int> C; 
    std::map<int, std::deque<int>> bucket {{1, A}, {2 , B}, {3, C}};
    

    【讨论】:

      【解决方案4】:

      编译器识别出这段代码

      bucket[1] = A;
      bucket[2] = B;
      bucket[3] = C;
      

      作为 declarations 应该指定类型,因为您不能在函数之外运行可执行代码(调用 assignment operator 是)(或者在声明变量时作为和初始化程序)。 在以下情况下:

      map<int,deque<int>> bucket;
      deque<int> A{3,2,1};
      deque<int> B;
      deque<int> C;  
      

      map&lt;int,deque&lt;int&gt;&gt;deque&lt;int&gt; 是类型说明符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-05
        • 2018-03-01
        • 2022-11-14
        • 1970-01-01
        相关资源
        最近更新 更多