由于 std::pair 导致的 GCC (MoSync) 中的 C++ 构建错误

Posted

技术标签:

【中文标题】由于 std::pair 导致的 GCC (MoSync) 中的 C++ 构建错误【英文标题】:C++ build error in GCC (MoSync) due to std::pair 【发布时间】:2013-01-31 16:35:53 【问题描述】:

我正在使用 MoSync IDE 为移动平台构建我的 C++ 代码。最初,C++ 代码是由 Visual Studio 2010 单独构建的,没有任何问题。但是当我使用 MoSync IDE 重建 C++ 代码时,它会产生一些错误消息。我的 C++ 代码使用 STL 库,例如 std::pair 和 std::vector 类。下面是在 MoSync IDE 中编译为错误的代码。 MoSync 使用 GCC 3.4.6。所以我认为这是由 GCC 编译器引起的。

template<typename T>
vector< pair<T, int> > histogram(const vector<T>& x, int numBins)

    T maxVal, minVal, range, delta, leftEdge, rightEdge;
    int i, dummyIdx;
    vector<T>::iterator pt;
    vector< pair<T, int> > counts(numBins, make_pair(T(), 0));
    vector<T> y(x);

//other code ...


错误信息是:

错误:预期为 `;'在“pt”之前(第 6 行)

此模板函数在给定输入向量 x 和 numBins 的情况下计算直方图,并将“counts”作为 (bins, counts) 对返回。最初我在 Visual Studio 2010 中编译了这个 C++ 代码,没有任何错误。但是 MoSync IDE 中的 GCC 给了我这个错误信息。所以这让我很困惑,为什么它无法在 GCC 中构建。

【问题讨论】:

【参考方案1】:

vector&lt;T&gt;::iterator 是依赖类型所以你需要使用typename:

typename vector<T>::iterator pt;

见Where and why do I have to put the "template" and "typename" keywords?

【讨论】:

这行得通。非常感谢。那么为什么 VS2010 不将此标记为错误,而 GCC 将其视为错误呢? @tonga:因为 Visual Studio 的默认模式不是严格的一致性模式。 TBH,我不确定非扩展模式是否也会拒绝它。

以上是关于由于 std::pair 导致的 GCC (MoSync) 中的 C++ 构建错误的主要内容,如果未能解决你的问题,请参考以下文章

MOS 6502 仿真器导致增强型基本以科学计数法输出

在异常对象上调用 std::move 是不是正确?

C++ 中的 std::pair 和 std::tuple

C++ 中的 std::pair 和 std::tuple

STL std::pair基本用法

解析编译错误:没有匹配函数调用 'std::pair<,>::pair()'