Спецификация по умолчанию вектора C++ пар строк как недопустимый параметр функции на gcc-4.1.2?

Это прекрасно вписывается как параметр в объявление функции на VS64 x64 (MSVC++ 2010), но не на RHEL5 (gcc 4.1.2):

const std::vector<std::pair<std::string, std::string> >& = std::vector<std::pair<std::string, std::string> >()

Вся функция, так как некоторые задали вопрос (с указанным параметром является третьим):

    bool func(const std::string&, const std::vector<int>&, const std::vector<std::pair<std::string, std::string> >& = 
        std::vector<std::pair<std::string, std::string> >(), const std::vector<std::string>& = std::vector<std::string>(), 
        const std::vector<std::string>& = std::vector<std::string>(), const std::vector<double>& = std::vector<double>(), 
        const std::vector<double>& = std::vector<double>(), const std::vector<double>& = std::vector<double>(), 
        const std::vector<double>& = std::vector<double>(), const std::vector<double>& = std::vector<double>(), 
        const std::string& = "", const std::string& = "", const std::string& = "") const;

Ошибка, которую я получил на RHEL5 gcc-4.1.2:

line #: error: expected ',' or '...' before '>' token
line #: error: wrong number of template arguments (1, should be 2)
line #: error: template argument 1 is invalid
line #: error: template argument 2 is invalid

Обратите внимание, что это прекрасно компилируется на обеих платформах с заменой третьего параметра на:

std::vector<std::string>& = std::vector<std::string>()

Мой текущий обходной путь - использовать последнюю форму и немного изменить мою реализацию, чтобы учесть ее, и это делает работу в настоящее время. Но любые идеи, почему первоначальное использование не основано на RHEL5 gcc-4.1.2 и что было бы правильным, очень приветствуются. Спасибо.

2 ответа

Решение

Код правильный. То, что у вас есть, скорее всего, ошибка в GCC 4.1. Не древние версии GCC компилируют этот код просто отлично.

Кроме этого, убедитесь, что вы действительно включаете заголовки, которые вам нужны:

#include <vector>
#include <string>
#include <utility> // for std::pair

Я думаю, что вы не включили <vector>,

В одном компиляторе он косвенно включается другим заголовком, поэтому объявление компилируется.

С другой стороны, он видел только декларацию std::vectorуказав два параметра шаблона, а не полное определение, указав значение по умолчанию для второго; поэтому компилятор жалуется, что должен быть второй.

Убедитесь, что вы включаете это, а также <string> а также <utility> за std::string а также std::pair,

Другие вопросы по тегам