C++ VC++;编译器升级2010->;2015年重新定义';constexpr';说明符不匹配

C++ VC++;编译器升级2010->;2015年重新定义';constexpr';说明符不匹配,c++,c++11,stl,visual-studio-2015,template-specialization,C++,C++11,Stl,Visual Studio 2015,Template Specialization,在将一个VC++项目从VS2010编译器升级到VS2015编译器的过程中,我遇到了这个错误,如有任何帮助,将不胜感激 C2475 'std::less<_Kty>::operator ()': redefinition; 'constexpr' specifier mismatch C2475'std::less::operator()':重新定义;'constexpr'说明符不匹配 这是生成错误的代码: bool std::less < sp < ref::db::

在将一个VC++项目从VS2010编译器升级到VS2015编译器的过程中,我遇到了这个错误,如有任何帮助,将不胜感激

C2475 'std::less<_Kty>::operator ()': redefinition; 'constexpr' specifier mismatch
C2475'std::less::operator()':重新定义;'constexpr'说明符不匹配
这是生成错误的代码:

bool std::less < sp < ref::db::string > >::operator()( 
    const sp < ref::db::string >& first, 
    const sp < ref::db::string >& second ) const 
{
    return first->cpp() < second->cpp();
}
bool std::less::operator()
常量sp&首先,
常量sp&秒)常量
{
返回第一个->cpp()<第二个->cpp();
}
第二个示例错误:

'std::less<sp<ref::ifile>>::operator ()': redefinition; 'constexpr' specifier mismatch
'std::less::operator()':重新定义;'constexpr'说明符不匹配
代码:

模板
bool std::less::操作符()(
常数sp&x,
常数sp&y)常数
{
如果(std::tolower(x->name()->cpp())
==std::tolower(y->name()->cpp())
{
返回std::tolower(x->extension()->cpp())
extension()->cpp());
}
返回std::tolower(x->name()->cpp())name()->cpp());
}

您是否尝试过使用其
运算符()专门化
std::less
类(functor)的常规模式

例如:

名称空间std
{
模板
无结构
{
布尔运算符(),
常数(秒)常数
{
//您的自定义std::less实现代码。。。
返回第一个->cpp()<第二个->cpp();
}
};
}//名称空间std

是否添加了std::less专门化?不要只专门化
std::less的
操作符()
,专门化整个结构。我认为它们已经专门化了,在vs2010中工作得很好,我所做的只是升级编译器,没有代码更改,为了清楚起见,我添加了另一个示例。@James当您的代码格式不正确时,您的代码可以工作。编译器升级可能会破坏您的代码。这已经发生了。用非格式错误的代码替换格式错误的代码是正确的解决方案。让格式错误的代码在“有效”但仍然格式错误的地方使用最小的更改进行编译是错误的解决方案。
template <>
bool std::less < sp < ref::ifile > >::operator()(
    const sp < ref::ifile >& x, 
    const sp < ref::ifile >& y ) const 
{
    if( std::tolower( x->name()->cpp() ) 
        == std::tolower( y->name()->cpp() ) )
    {
        return std::tolower( x->extention()->cpp() ) 
               < std::tolower( y->extention()->cpp() );
    }

    return std::tolower( x->name()->cpp() ) < std::tolower( y->name()->cpp() );
}
namespace std 
{

template<>
struct less<sp<ref::db::string>> 
{
    bool operator()(const sp<ref::db::string>& first, 
                    const sp<ref::db::string>& second) const 
    {
        // Your custom std::less implementation code ...

        return first->cpp() < second->cpp();    
    }
};

} // namespace std