Ошибка в std::pair при компиляции для mac / linux

У меня проблема при компиляции моего кода под Mac OS. Это объявление функции в моем заголовочном файле, по-видимому, вызывает некоторые ошибки (хотя в Windows оно работает нормально):

#include <string>
#include <vector>
#include <map>

#ifdef WIN32
    #include <windows.h>
#endif

[...]

    int setProcessEnvironment(
        const wchar_t * procName,
        const wchar_t * appName = NULL,
        const wchar_t * workingDir = NULL,
        const wchar_t * cmdArgs = NULL,
        const std::vector< std::pair<const wchar_t *, int> > &systemEnvVars = std::vector< std::pair<const wchar_t *, int> >()
    );

Похоже, что компилятору не нравятся входные данные для моей пары - может быть, мне не хватает некоторых включений или в чем здесь проблема?

Я также не до конца понимаю последнюю строку этого сообщения об ошибке, поскольку описание моей функции на самом деле очень отличается от описанного в этой ошибке...

Я начинаю думать, что это может быть связано с инициализацией по умолчанию, но в чем здесь разница между компилятором Mac и Windows?

26: error: expected ‘,’ or ‘...’ before ‘>’ token
26: error: wrong number of template arguments (1, should be 2)
/usr/include/c++/4.2.1/bits/stl_pair.h:68: error: provided for ‘template<class _T1, class _T2> struct std::pair’
26: error: template argument 1 is invalid
26: error: template argument 2 is invalid
26: error: default argument missing for parameter 6 of ‘int SysProcManager::setProcessEnvironment(const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*, const std::vector<std::pair<const wchar_t*, int>, std::allocator<std::pair<const wchar_t*, int> > >&, int)’
159: error: prototype for ‘int SysProcManager::setProcessEnvironment(const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*, const std::vector<std::pair<const wchar_t*, int>, std::allocator<std::pair<const wchar_t*, int> > >&)’ does not match any in class ‘SysProcManager’
26: error: candidates are: int SysProcManager::setProcessEnvironment(const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*, const std::vector<std::pair<const wchar_t*, int>, std::allocator<std::pair<const wchar_t*, int> > >&, int)
138: error:                 int SysProcManager::setProcessEnvironment(const wchar_t*, const wchar_t*, const wchar_t*, const wchar_t*, const std::vector<const wchar_t*, std::allocator<const wchar_t*> >&)

3 ответа

Решение

На это указал Андре Карон:

Из любопытства, вы можете напечатать std::vector EnvironmentBlock; (измените имя по своему вкусу). Замените два экземпляра в объявлении вашей функции. Посмотрите, устраняет ли это какие-либо ошибки синтаксического анализа.

Я сейчас заявляю typedef std::vector< std::pair<const wchar_t*, int> > EnvironmentBlock; в начале, и это действительно решает эту проблему на Mac, и кажется, что компилятор просто не может должным образом справиться с этими вложенными типами и все испортил - я не видел этой проблемы в Linux или Windows, поэтому, возможно, пришло время обновить мой компилятор (GCC 4.2).

Спасибо, Андре!

Пытаться #include <utility>

Некоторые из ошибок связаны с тем, что у вас есть 2 определения setProcessEnvironment. Один, который принимает в качестве добавленного int в конце, а другой - в векторе wchar_t (не в векторе пар).

Я бы сосредоточился на этих 2 проблемах для начала. В противном случае нам нужно увидеть остальную часть кода, потому что некоторые ошибки генерируются кодом, который мы не видим.

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