C++ STL中string大小写转换 transform算法中toupper的使用注意事项

在std中toupper的原型为一个二元函数

标准库重载了一个touppe函数,而GCC完全由C库去提供重载,而glibc做不到这一点,所以在编译的时候g++就认为这个函数有歧义了。下面就是在标准库中toupper函数的两种形式:

int std :: toupper ( int ); // from <cctype>

 

template < class chart >

charT std :: toupper ( charT , const locale &);  // from <locale>

 

    问题找出来了,但是总要有解决的方法。既然报错是因为有歧义,所以只要把歧义消除便可。

1、通过介入包装函数

这是最简单的办法,因为包装函数只有一个,只要在包装函数中指明要使用的函数,歧义自然就没了,以toupper为例,我们可以使用下面这样的一个包装函数:

 Int toUpper( int c )

{

       return toupper( c ) ;

}

 

2、强制转化:将toupper转换为一个返回值为int,参数只有一个int的函数指针:

std::transform(s.begin(), s.end(), s.begin(), (int(*)(int)) toupper);

 

3GCC中将toupper实现为一个宏而不是函数,而在全局命名空间中有实现的函数(而不是宏),所以我们明确命名空间,这并不是总奏效,但是在我的g++环境中没有问题:

transform(s.begin(), s.end(), s.begin(), ::toupper);

 

猜你喜欢

转载自blog.csdn.net/Cookey_July/article/details/81459381