C++ VC++;编译器升级2010->;2015年重新定义';constexpr';说明符不匹配
在将一个VC++项目从VS2010编译器升级到VS2015编译器的过程中,我遇到了这个错误,如有任何帮助,将不胜感激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::
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