我在Stroustrup的“原则与实践”第10章中做了一些工作,他提出创建一个表格,用于将月份数转换为其名称,反之亦然。该表采用字符串向量的形式,然后由程序头文件中声明的几个函数使用。我尝试了一个简单的方法并在同一个头中声明+ init向量,以便所有函数都可以看到它:
std::vector<std::string> monthNames(12);
monthNames[0] = "jan";
monthNames[1] = "feb";
monthNames[2] = "mar";
monthNames[3] = "apr";
monthNames[4] = "may";
monthNames[5] = "jun";
monthNames[6] = "jul";
monthNames[7] = "aug";
monthNames[8] = "sep";
monthNames[9] = "oct";
monthNames[10] = "nov";
monthNames[11] = "dec";
现在G ++似乎并不理解我正在尝试做什么:
In file included from temperature.cpp:1:
./Temperature.h:48:1: error: C++ requires a type specifier for all declarations
monthNames[0] = "jan";
^~~~~~~~~~
./Temperature.h:49:1: error: C++ requires a type specifier for all declarations
monthNames[1] = "feb";
...
我一般都明白,在标题中声明一个全局向量是一种不好的做法,但在这个例子中,它似乎是将nums转换为月份名称的函数中12个{if ... elses}的合理替代反之亦然:
const std::string& intToMonth(int num) {
if ( num < 1 || num > 12 )
throw BadMonthException();
return monthNames[num-1];
}
所以我有两个问题:
1)为什么编译器不允许我初始化向量?
2)是否有一种更性感的方式使它全部工作(没有全局载体)?
答案 0 :(得分:1)
提供包含文件不会被包含多次,您可以使用匿名namespace
和初始化列表,例如:
namespace {
std::vector<std::string> monthNames{ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"};
}
答案 1 :(得分:1)
你可以试试这样的东西(适用于比c ++ 11更早的cpp标准):
const std::string _monthNames[] = { "jan", "feb", ... };
std::vector<std::string> monthNames(_monthNames,
_monthNames+sizeof(_monthNames)/sizeof(std::string));
关于你的问题: