set <T> vs set <T,comparator>(C++ polymorphism)

Ric*_*all 4 c++ polymorphism stl set

为什么这个代码

struct ThingComparator
{
    ...
}

static void Blah (set <CString> &things)
{
    ...
}

...

set<CString, ThingComparator>things;
Blah (things);
Run Code Online (Sandbox Code Playgroud)

无法编译时出现以下错误(Visual Studio 2010):

error C2664: 'Blah' : cannot convert parameter 1 from 'std::set<_Kty,_Pr>' to 'std::set<_Kty> &'
Run Code Online (Sandbox Code Playgroud)

我的C++知识显然是有限的,但我希望听到一个小号宣布他的可靠骏马上的多态骑士,但我所能听到的只是一个马屁和一个悲伤的长号:-(

rig*_*old 9

std::set声明如下:

template<
    class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>
> class set;
Run Code Online (Sandbox Code Playgroud)

因此,std::set<CString>真的意味着std::set<CString, std::less<CString>, std::allocator<CString>>,而std::less<CString>不是ThingComparator.写下以下内容:

struct ThingComparator {
    ...
};

template<typename Comparator>
static void Blah(std::set<CString, Comparator>& things) {
    ...
}

...

std::set<CString, ThingComparator> things;
Blah(things);
Run Code Online (Sandbox Code Playgroud)