-2

我已经在 PC 上用 make 编译并链接了一些 c++ 源文件,没有错误。然后我使用相同的源文件和相同的 makefile 并在 mac 上尝试,但出现 6 个错误。编译器应该是相同的,并以相同的方式解释文件,但显然不是?会不会是mac中使用的LLVM-g++不同于PC上的g++?

所有错误都有这个路径:/usr/include/c++/4.2.1/bits/stl_iterator_base_types.h

g++ 版本 4.6.1 (PC) 和 Apple LLVM 版本 5.0 (clang-500.2.76) (基于 LLVM 3.3svn) 在 mac

一个错误是:

usr/include/c++/4.2.1/bits/stl_iterator_base_types.h:129:35: error: no type
  named 'value_type' in 'std::pair<int, int>'
  typedef typename _Iterator::value_type        value_type;
          ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
4

1 回答 1

2

使用相同的源代码和 makefile 不一定会在不同平台上产生相同的行为。以下是一些可能导致差异的事情:

  • makefile 可以做特定于平台的事情。
  • 源代码可以使用预处理器来区分平台。
  • 编译器和编译器版本可能会对源代码产生不同的影响
    • 可能支持不同的功能和扩展
    • 可能有不同的错误
    • 可能需要不同的论据
  • 平台库可能不同。
    • 平台特定的库在其他平台上不可用
    • 不同的标准库实现可能有不同的扩展/错误。
    • 不同的标准库实现可能针对不同的规范版本(例如,C++03 与 C++11 库)。
    • 以导致未定义或实现定义的行为的方式使用库可能会在不同实现之间产生不同的结果。
    • “便携式”但不是标准化的库可能会有所不同(例如,函数采用char *char const *

从您发布的错误“错误:在'std :: pair'中没有名为'value_type'的类型”我猜你正在错误地使用标准库并且你正在使用的标准库实现之一让你逃脱有它,但另一个没有。

似乎在您的代码中的某个时刻,您正在使用不符合要求的模板参数实例化一个模板,因此在模板实例化的深处发生了错误。作为该错误消息的一部分,编译器应该为您提供导致它的模板实例化列表。您需要跟踪您的代码以查看您错误使用的模板。

于 2013-10-22T17:50:33.423 回答