我在NS上添加了一个新补丁,我看到了这两个错误。有谁知道我能做什么?
error: specialization of 'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = _AlgorithmTime]' in different namespace
from definition of 'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = _AlgorithmTime]'
,错误来自此代码
typedef struct _AlgorithmTime {
// Round.
int round;
// Fase.
int fase;
// Valore massimo di fase.
int last_fase;
public:
_AlgorithmTime() {
round = 0;
fase = 0;
last_fase = 0;
}
// Costruttore.
_AlgorithmTime(int r, int f, int l) {
round = r;
fase = f;
last_fase = l;
}
// Costruttore.
_AlgorithmTime(const _AlgorithmTime & t) {
round = t.round;
fase = t.fase;
last_fase = t.last_fase;
}
// Operatore di uguaglianza.
bool operator== (struct _AlgorithmTime & t) {
return ((t.fase == fase) && (t.round == round));
}
// Operatore minore.
bool operator < (struct _AlgorithmTime & t) {
if (round < t.round)
return true;
if (round > t.round)
return false;
if (fase < t.fase)
return true;
return false;
}
// Operatore maggiore.
bool operator > (struct _AlgorithmTime & t) {
if (round > t.round)
return true;
if (round < t.round)
return false;
if (fase > t.fase)
return true;
return false;
}
void operator++ () {
if (fase == last_fase) {
round++;
fase = 0;
return;
}
fase++;
}
void operator-- () {
if (fase == 0) {
round--;
fase = last_fase;
return;
}
fase--;
}
}AlgorithmTime;
template<>
bool
std::less<AlgorithmTime>::operator()(const AlgorithmTime & t1, const AlgorithmTime & t2)const
{
if (t1.round < t2.round)
return true;
if (t1.round > t2.round)
return false;
if (t1.fase < t2.fase)
return true;
return false;
}
由于
答案 0 :(得分:2)
如果std::less<AlgorithmTime>::operator()
的专业化在你的命名空间内,那可能就是编译器所抱怨的 - 你需要在'全局'命名空间级别进行专门化。
顺便说一下,虽然可以专门化std::less
,但在您的情况下没有必要 - std::less<AlgorithmTime>
的标准定义将使用AlgorithmTime::operator<()
来完成其工作。
答案 1 :(得分:0)
您只需指定要尝试专门化的模板的命名空间:
namespace std
{
template<>
bool
std::less<AlgorithmTime>::operator()(const AlgorithmTime & t1, const AlgorithmTime & t2)const
{
...
}
}
但是正如Michael Burr指出的那样,没有理由专注std::less
,如果您打算做的只是复制AlgorithmTime::<
的代码。
答案 2 :(得分:0)
问题是你正在为AlgorithmTime类创建std :: less :: operator()的模板特化,但是这个特化是在与函数的原始模板不同的命名空间中。
您可以通过明确声明您的专业化位于std命名空间中来解决此问题,如下所示:
namespace std{
template<>
bool
less<AlgorithmTime>::operator()(const AlgorithmTime & t1, const AlgorithmTime & t2)const // "std::less" is no longer necessary
{
if (t1.round < t2.round)
return true;
if (t1.round > t2.round)
return false;
if (t1.fase < t2.fase)
return true;
return false;
}
}