【问题标题】:Error on std::pair when compiling for mac / linux为 mac / linux 编译时 std::pair 出错
【发布时间】:2011-05-15 08:49:34
【问题描述】:

在 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*> >&)

【问题讨论】:

  • 您的错误似乎与函数的调用有关。你能告诉我们第 26 行在哪里吗?
  • 我在上面的小代码示例中包含了第 26 行 - 这是该函数的头文件声明
  • 你打算用 const 对空向量的引用做什么?
  • 出于好奇,你能typedef std::vector&lt; std::pair&lt;const wchar_t*,int&gt; &gt; EnvironmentBlock;吗(改名字为你喜欢的)。替换函数声明中的两个实例。看看这是否能清除任何解析错误。
  • 你在 Mac 上使用什么编译器版本?

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


【解决方案1】:

试试#include &lt;utility&gt;

【讨论】:

  • 我认为#include &lt;map&gt; 应该得到你std::pair,因为它需要std::pair。但我在这里看不到其他任何问题......
  • @Charles: std::pair 应该在&lt;utility&gt; 中定义
  • @UncleBens,我知道,但是OP是#include &lt;map&gt;,而&lt;map&gt;必须使用std::pair,所以我认为OP的问题不可能是编译器找不到std::pair 的定义。
  • 并且提到了定义std::pair的g++专用文件bits/stl_pair.h,所以定义肯定看过了。
  • @Praetorian,我同意。但是,我只是指出,在这种特殊情况下,找不到std::pair 的定义很可能不是问题。
【解决方案2】:

一些错误与您有两个 setProcessEnvironment 定义有关。一个在末尾作为添加的 int ,另一个在 wchar_t 的向量(不是对的向量)中获取。

我会首先关注这两个问题。由于某些错误是由我们看不到的代码生成的,因此我们需要查看其余代码。

【讨论】:

  • 是的,这个函数有两个声明,但最后没有添加 int ......编译器只认为是这种情况,我的问题是如何解决这个问题 - 抱歉,如果问题不是那么清楚 - 但这些都不是一个真正的问题,因为我可以多次重载我的函数
  • @Chris:根据编译器错误,两者都不匹配您在上面发布的内容。我们可以看看剩下的代码吗?
  • 我不确定你的意思,但显然这就是问题:为什么编译器不能正确解释我的函数声明..?我认为实际上不需要查看更多代码并且问题已解决(请参阅我上面引用的 Andre 的消息)
  • @Chris:我不知道……把剩下的代码贴出来,我也许能帮上忙!
  • 感谢 - 使用“typedef std::vector EnvironmentBlock;”现在工作正常
【解决方案3】:

André Caron 指出了这一点:

出于好奇,你能 typedef 标准::向量环境块; (根据自己的喜好更改名称)。 替换您的两个实例 函数声明。看看有没有 清除任何解析错误。

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

谢谢安德烈!

【讨论】:

    猜你喜欢
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多