views:

516

answers:

2

I am running g++(gcc version 3.4.4) on cygwin.

I can't get this small snippet of code to compile. I included the appropriate headers.

int main(){

    std::string temp("asgfsgfafgwwffw");

    std::transform(temp.begin(),
                   temp.end(),
                   temp.begin(),
                   std::toupper);

    std::cout << "result:" << temp << std::endl;

    return 0;
}

I have not had any issues using STL containers such as vector. Does anyone have any suggestions or insights into this situation. Thanks.

A: 

This explains it quite well.

Which will boil down to this code:

std::transform(temp.begin(),temp.end(),temp.begin(),static_cast<int (*)(int)>(std::toupper));
Ryan
please explain the problem *in* the post. External articles may be taken down, and then your answer will be useless. Plus it's a pain for all of us to have to follow an external link just to know whether your answer is correct or not.
jalf
I apologise for having missed this obvious solution.
Pradyot
A: 

From the link above.

#include <cctype> // for toupper
#include <string>
#include <algorithm>
using namespace std;

void main()
{
string s="hello";
transform(s.begin(), s.end(), s.begin(), toupper);
}

Alas, the program above will not compile because the name 'toupper' is ambiguous. It can refer either to:

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

or

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

Use an explicit cast to resolve the ambiguity:

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

This will instruct the compiler to choose the right toupper().