这是我的代码:
using namespace std;
class Pixel
{
public:
bool AreSamplesIdentical() const
{
return true;
}
};
namespace
{
class Predicate_SamplesEqual : public unary_function<const Pixel&, bool>
{
public:
bool operator () (const Pixel& pixel) const
{
return pixel.AreSamplesIdentical();
}
};
}
int main()
{
vector<Pixel> pixels(10);
find_if(pixels.begin(), pixels.end(), not1(Predicate_SamplesEqual()));
}
在Visual Studio 2008 C ++ Express上,出现错误: 错误C2529:'_ Left':对引用的引用是非法的 从库内代码开始。
但我在这里尝试并编译: http://ideone.com/swWrZT
这里有谁错?如果我,我该如何编写变通方法?
错误发生在功能
的指示行上 // TEMPLATE CLASS unary_negate
template<class _Fn1>
class unary_negate
: public unary_function<typename _Fn1::argument_type, bool>
{ // functor adapter !_Func(left)
public:
explicit unary_negate(const _Fn1& _Func)
: _Functor(_Func)
{ // construct from functor
}
/**error**/bool operator()(const typename _Fn1::argument_type& _Left) const
{ // apply functor to operand
return (!_Functor(_Left));
}
protected:
_Fn1 _Functor; // the functor to apply
};
答案 0 :(得分:4)
我想这个错误是由于unary_function
使用第一个模板参数作为类型并作出参考:
template<typename Arg, typename Result>
struct unary_function
{
typedef Arg argument_type;
typedef Result result_type;
...
virtual result_type operator()(const argument_type& _Left) const = 0;
...
}
因此,如果Arg
为const X&
,则operator()
使用const X& &
- 引用引用,而vc 9.0无法处理它。
明显的解决方法是写:
class Predicate_SamplesEqual : public unary_function<Pixel, bool>
...
答案 1 :(得分:1)
这里有谁错?
当使用默认选项运行时,MSVC和GCC都声称不符合任何标准,因此两者都不是“错误”。
在这种情况下,GCC 4.7应用了C ++ 11引用 - 折叠规则(即使没有C ++ 11模式,它也是GNU扩展)。
如果您希望GCC符合以前的标准,请通过命令行选项--std=c++98
,它将拒绝您的代码。