GCC 无法正确解析 std::accumulate
GCC cannot resolve proper std::accumulate
我正在尝试使用 GCC 4.4.7 和 MSVC 2010 编译这样的代码:
// test.cpp
// use g++ -c test.cpp to attempt compile this
#include <map>
#include <numeric>
#include <algorithm>
struct A
{
A() : v1(0), v2(0) {}
int v1, v2;
};
typedef std::map<int, A> A_map;
void fill_map(A_map& m); // external function
A process()
{
A_map m;
fill_map(m);
A a;
if(!m.empty())
{
struct Aggregate
{
A operator()(const A& left, const A_map::value_type& right)
{
A result;
result.v1 = left.v1 + right.second.v1;
result.v2 = std::max(left.v2, right.second.v2);
return result;
}
};
A a0;
a = std::accumulate(m.begin(), m.end(), a0, Aggregate());
}
return a;
}
虽然 MSVC2010 编译得很好,但 GCC 4.4.7 给出了以下错误:
test.cpp: In function ‘A process()’:
test.cpp:33: error: no matching function for call to ‘accumulate(std::_Rb_tree_iterator<std::pair<const int, A> >, std::_Rb_tree_iterator<std::pair<const int, A> >, A&, process()::Aggregate)’
知道为什么会这样以及如何解决这个问题吗?
像使用 C++11 lambda 完全重写代码这样的想法是行不通的——恰好需要这段代码。
C++03 不允许实例化具有本地类型的模板。如果您不能使用 C++11 或 C++14,则可以通过将 Aggregate
的定义移到 process
函数之外来解决该问题。为了更好地衡量,使其 operator()
成为 const
成员。
#include <map>
#include <numeric>
#include <algorithm>
struct A
{
A() : v1(0), v2(0) {}
int v1, v2;
};
struct Aggregate
{
A operator()(const A& left, const A_map::value_type& right) const
{
....
}
};
void fill_map(A_map& m); // external function
A process()
{
....
}
我正在尝试使用 GCC 4.4.7 和 MSVC 2010 编译这样的代码:
// test.cpp
// use g++ -c test.cpp to attempt compile this
#include <map>
#include <numeric>
#include <algorithm>
struct A
{
A() : v1(0), v2(0) {}
int v1, v2;
};
typedef std::map<int, A> A_map;
void fill_map(A_map& m); // external function
A process()
{
A_map m;
fill_map(m);
A a;
if(!m.empty())
{
struct Aggregate
{
A operator()(const A& left, const A_map::value_type& right)
{
A result;
result.v1 = left.v1 + right.second.v1;
result.v2 = std::max(left.v2, right.second.v2);
return result;
}
};
A a0;
a = std::accumulate(m.begin(), m.end(), a0, Aggregate());
}
return a;
}
虽然 MSVC2010 编译得很好,但 GCC 4.4.7 给出了以下错误:
test.cpp: In function ‘A process()’:
test.cpp:33: error: no matching function for call to ‘accumulate(std::_Rb_tree_iterator<std::pair<const int, A> >, std::_Rb_tree_iterator<std::pair<const int, A> >, A&, process()::Aggregate)’
知道为什么会这样以及如何解决这个问题吗? 像使用 C++11 lambda 完全重写代码这样的想法是行不通的——恰好需要这段代码。
C++03 不允许实例化具有本地类型的模板。如果您不能使用 C++11 或 C++14,则可以通过将 Aggregate
的定义移到 process
函数之外来解决该问题。为了更好地衡量,使其 operator()
成为 const
成员。
#include <map>
#include <numeric>
#include <algorithm>
struct A
{
A() : v1(0), v2(0) {}
int v1, v2;
};
struct Aggregate
{
A operator()(const A& left, const A_map::value_type& right) const
{
....
}
};
void fill_map(A_map& m); // external function
A process()
{
....
}