23

I would like to have an std::map (int .NET 4.0). We of course know that a map is a tree and requires an operator< that string does not define for us.

Error 24 error C2676: binary '<' : 'const std::string' does not define this operator or a conversion to a type acceptable to the predefined operator c:\program files\microsoft visual studio 10.0\vc\include\xfunctional 125 1 FXCMMarketDataServer

So I put my google-foo to work and found this solution:

struct StringComparerForMap
{
public:
    bool operator()(const std::string x, const std::string y)
    {
         // Add compare logic here
    }
};

...
std::map<std::string, CustomObject, StringComparerForMap> myMap;

This worked fine for a while, and now I'm encountering a bug that I believe is due to this. Somewhere deep down in the STL framework it would seem that it ignores the above definition and defaults to operator<.

Is there a way in VS2010 .NET 4.0 to use a string as the key of a map?

I understand that I can take that string and write a function to hash it to an int, but where's the fun in that?

EDIT

I will try and explain this as best I can for David. When the map uses the comparer struct, it crashes in release and fails a debug assertion in debug. The assert that fails is in xtree line 1746.

Expression: invalid operator<

|Abort| |Retry| |Ignore|

That is what leads me to believe that despite giving map a comparer, it still down certain paths defaults to operator< for comparison. The line in my code that causes this is:

CustomObject o = stringObjectMap[key];
3
  • 7
    std::string does have a suitable definition of the required operator. Are you certain you have included the <string> header? I think I have seen similar issues when I failed to include it; forward declares of std::string mean that its name itself is known. Commented Feb 8, 2011 at 22:30
  • 3
    .NET has nothing to do with std::map or std::string Commented Feb 8, 2011 at 22:41
  • 3
    What makes you think that deep inside the library layers it defaults to <? If it were so, it would be broken and you should file a bug report, but most probably you are misinterpreting the data --that error would get triggered in many other situations, someone would probably have detected it before... When I told my first boss that the compiler was wrong he smiled and said: 99% of the time, the problem is located between the chair and the keyboard and not in the compiler Commented Feb 8, 2011 at 23:19

1 Answer 1

72

Error 24 error C2676: binary '<' : 'const std::string' does not define this operator or a conversion to a type acceptable to the predefined operator c:\program files\microsoft visual studio 10.0\vc\include\xfunctional 125 1 FXCMMarketDataServer

That's what VC spits into your face when you forgot to include <string>. That header definitely defines this operator.

Sign up to request clarification or add additional context in comments.

1 Comment

This just happened to me, spent a hour playing with maps and keep getting this error over and over. I thought "Why does every example on the internet fail!". It turns out I forgot a darn string header. I feel kinda silly now....

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.