NS c ++编程中的一个问题

时间:2010-06-13 16:48:08

标签: c++

我在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;
}

由于

3 个答案:

答案 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;
    }
}