关注此问题:How to negate a predicate function using operator ! in C++?
我想创建一个运营商!可以使用从unary_function继承的任何仿函数。我试过了:
template<typename T>
inline std::unary_negate<T> operator !( const T& pred ) {
return std::not1( pred );
}
编译抱怨:
Error 5 error C2955: 'std::unary_function' : use of class template requires template argument list c:\program files\microsoft visual studio 10.0\vc\include\xfunctional 223 1 Graphic
Error 7 error C2451: conditional expression of type 'std::unary_negate<_Fn1>' is illegal c:\program files\microsoft visual studio 10.0\vc\include\ostream 529 1 Graphic
Error 3 error C2146: syntax error : missing ',' before identifier 'argument_type' c:\program files\microsoft visual studio 10.0\vc\include\xfunctional 222 1 Graphic
Error 4 error C2065: 'argument_type' : undeclared identifier c:\program files\microsoft visual studio 10.0\vc\include\xfunctional 222 1 Graphic
Error 2 error C2039: 'argument_type' : is not a member of 'std::basic_ostream<_Elem,_Traits>::sentry' c:\program files\microsoft visual studio 10.0\vc\include\xfunctional 222 1 Graphic
Error 6 error C2039: 'argument_type' : is not a member of 'std::basic_ostream<_Elem,_Traits>::sentry' c:\program files\microsoft visual studio 10.0\vc\include\xfunctional 230 1 Graphic
有什么想法吗?
更新
按照“templatetypedef”解决方案,我收到了新的错误:
Error 3 error C2831: 'operator !' cannot have default parameters c:\visual studio 2010 projects\graphic\graphic\main.cpp 39 1 Graphic
Error 2 error C2808: unary 'operator !' has too many formal parameters c:\visual studio 2010 projects\graphic\graphic\main.cpp 39 1 Graphic
Error 4 error C2675: unary '!' : 'is_prime' does not define this operator or a conversion to a type acceptable to the predefined operator c:\visual studio 2010 projects\graphic\graphic\main.cpp 52 1 Graphic
更新1
完整代码:
#include <iostream>
#include <functional>
#include <utility>
#include <cmath>
#include <algorithm>
#include <iterator>
#include <string>
#include <boost/assign.hpp>
#include <boost/assign/std/vector.hpp>
#include <boost/assign/std/map.hpp>
#include <boost/assign/std/set.hpp>
#include <boost/assign/std/list.hpp>
#include <boost/assign/std/stack.hpp>
#include <boost/assign/std/deque.hpp>
struct is_prime : std::unary_function<int, bool> {
bool operator()( int n ) const {
if( n < 2 )
return 0;
if( n == 2 || n == 3 )
return 1;
if( n % 2 == 0 || n % 3 == 0 )
return 0;
int upper_bound = std::sqrt( static_cast<double>( n ) );
for( int pf = 5, step = 2; pf <= upper_bound; ) {
if( n % pf == 0 )
return 0;
pf += step;
step = 6 - step;
}
return 1;
}
};
/*
template<typename T>
inline std::unary_negate<T> operator !( const T& pred, typename T::argument_type* dummy = 0 ) {
return std::not1<T>( pred );
}
*/
inline std::unary_negate<is_prime> operator !( const is_prime& pred ) {
return std::not1( pred );
}
template<typename T>
inline void print_con( const T& con, const std::string& ms = "", const std::string& sep = ", " ) {
std::cout << ms << '\n';
std::copy( con.begin(), con.end(), std::ostream_iterator<typename T::value_type>( std::cout, sep.c_str() ) );
std::cout << "\n\n";
}
int main() {
using namespace boost::assign;
std::vector<int> nums;
nums += 1, 3, 5, 7, 9;
nums.erase( remove_if( nums.begin(), nums.end(), !is_prime() ), nums.end() );
print_con( nums, "After remove all primes" );
}
谢谢,
Chan Nguyen
答案 0 :(得分:3)
答案 1 :(得分:2)
您获得的模糊错误是C ++模板错误的典型示例。它试图说的是你试图用不兼容的类型调用operator !()
函数。 std::unary_negate<>
期望其模板参数具有argument_type
typedef,并且传递给该函数的对象没有此typedef。
那就是说,我不确定你想要实现的目标。标准库已具有此功能,但名称不同:std::not1()
。你为什么要包装它?用户确切地知道std::not1(f)
的含义,但!f
看起来像是一个关于用户在给定上下文中可能期望的陷阱。
答案 2 :(得分:0)
我不知道你究竟在编译什么,但是我怀疑你使用std :: unary_function而没有所需的模板参数,不是吗?
你能展示完整的代码吗?