2015-03-13 3 views
0

Я немного разбираюсь в главе 10 «Принципов и практики» Страуступа, где он предлагает создать таблицу для преобразования чисел месяцев в их имена и наоборот. Эта таблица находится в виде вектора строки, который затем используется несколькими функциями, объявленными в файле заголовка программы. Я попытался пройти легкий путь и объявить + инициализации вектора в том же заголовке, так что все функции могли видеть:Инициализировать строковый вектор в заголовочном файле

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"; 

... 

Я понимаю, в общем, что объявить глобальный вектор в заголовке является плохой практикой, но в данном примере это представляется разумным заменителем 12 {если ...} в вернулись на Родину функций, которые преобразовывают Nums к месяцам и наоборот:

const std::string& intToMonth(int num) { 
    if (num < 1 || num > 12) 
     throw BadMonthException(); 

    return monthNames[num-1]; 
    } 

У меня есть два вопроса:

1) Почему компилятор не разрешил мне инициализировать вектор?

2) Есть ли более сексуальный способ заставить все это работать (без глобального вектора)?

+0

Я предполагаю, что вы '#include ' и '#include '? – CoryKramer

+0

Предоставьте [MCVE] (http://stackoverflow.com/help/mcve). Кроме того, какие версии компилятора и стандартной библиотеки вы используете? – Drop

+0

@Cyber ​​Это не похоже на вопрос C++ 11. Просто FYI. – Blacktempel

ответ

1

Предоставление включаемого файла не более одного раза, вы можете использовать анонимный namespace и список инициализации, что-то вроде:

namespace { 
    std::vector<std::string> monthNames{ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"}; 
} 
1

Вы можете попробовать что-то вроде этого (работает CPP стандартов старше C++ 11):

const std::string _monthNames[] = { "jan", "feb", ... }; 
std::vector<std::string> monthNames(_monthNames, 
            _monthNames+sizeof(_monthNames)/sizeof(std::string)); 

Что касается ваших вопросов:

  1. ГНА теги не могут использоваться в качестве деклараций в соответствии с правилами грамматики C++.
  2. Рассмотрите возможность использования статических функциональных переменных - переменных, которые видны только в области действия функции, но имеют одинаковое время жизни, чем глобальные переменные.
Смежные вопросы