编译mac / linux时std :: pair出错

时间:2010-11-24 21:08:00

标签: c++ windows macos compiler-construction std

在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 个答案:

答案 0 :(得分:2)

尝试#include <utility>

答案 1 :(得分:2)

AndréCaron指出了这一点:

  

出于好奇,你能打字吗?   的std ::矢量&lt; std :: pair&gt; EnvironmentBlock;   (根据自己的喜好更改名称)。   替换你的两个实例   功能声明。看看是否这样   清除任何解析错误。

我现在正在声明typedef std::vector< std::pair<const wchar_t*, int> > EnvironmentBlock;开头,它确实在Mac上解决了这个问题,似乎编译器无法正确处理这些嵌套类型并搞砸了事情 - 我没有看到这个问题在Linux或Windows上,也许是时候更新我的编译器(GCC 4.2)。

谢谢Andre!

答案 2 :(得分:0)

有几个错误与你有2个setProcessEnvironment定义的事实有关。一个在结尾处作为添加的int而另一个在wchar_t的向量中获取(不是对的向量)。

我首先关注这两个问题。如果失败,我们需要看到其余的代码,因为有些错误是由我们看不到的代码生成的。