1

我有一个包含以下内容的 cpp 文件:

char const* types[] = { "char", "short", "int", "long", "float", "double", "void"};
std::set<std::string> ReservedWords;
ReservedWords.insert(std::begin(types),std::end(types));

这给出了一个错误missing type specifier - int assumed. Note: C++ does not support default-int

我读过您不能在全局范围内编写语句,这里是这种情况吗?

我不完全理解规则,想知道把这段代码放在哪里最好?(头文件,函数内部等......)

4

3 回答 3

2

首先,不是C++11 std::beginstd::end所以你确定你有一个兼容的编译器并且你正在编译 C++11 支持吗?

我不相信这是错误。您是否包括:

#include <string>
#include <set>
#include <iterator>

?

于 2012-06-10T08:46:23.070 回答
2
char const* types[] = { "char", "short", "int", "long", "float", "double", "void"};
std::set<std::string> ReservedWords;
ReservedWords.insert(std::begin(types),std::end(types));

这里的前两行是声明,因为它们声明了变量(typesReservedWords)。第三行不是声明,它只是一个表达式语句,所以它出现在函数之外是不合法的。

您可以执行以下操作:

char const* types[] = { "char", "short", "int", "long", "float", "double", "void"};
std::set<std::string> MakeReservedWords() {
    std::set<std::string> tmp;
    tmp.insert(std::begin(types), std::end(types));
    return tmp;
}

std::set<std::string> ReservedWords(MakeReservedWords());

鉴于您使用的是 C++11,您应该能够做到这一点:

std::set<std::string> ReservedWords { "char", "short", "int", "long", "float", "double", "void"};

如果您的编译器不支持 C++11 的这一部分,您将不得不接受这样的事情(正如@juanchopanza 所建议的那样):

char const* types[] = { "char", "short", "int", "long", "float", "double", "void"};
std::set<std::string> ReservedWords(std::begin(types), std::end(types));
于 2012-06-10T08:56:53.950 回答
1

如果您没有包含正确的文件,则会出现此错误。确保添加
#include <string.h>

是的,您必须从全局范围中删除此行:

ReservedWords.insert(std::begin(types),std::end(types));

试着把它放在主函数中。

于 2012-06-10T11:16:17.027 回答