错误 c2373 使用模板类重新定义不同的类型修饰符

Joh*_*Elk 5 c++ templates constants visual-c++ c++03

我编写了一个模板Interval类,我想将其用作数字间隔的容器。由于我想迭代此类中实际ItervalIter包含的元素,因此我添加了一个模板友元类。

当我在 Linux 上使用 编译项目以及gcc在 MacOS 上使用 编译项目时clang,一切都编译得很好,没有警告。当我在 Windows 上使用 进行编译时msvc,出现以下错误消息:

C2373 'utils::Interval<T>::begin': redefinition. The type modifiers are different
C2447 '{': missing function header (old-style formal list?)
C2373 'utils::Interval<T>::end': redefinition. The type modifiers are different
C2447 '{': missing function header (old-style formal list?)
Run Code Online (Sandbox Code Playgroud)

我简化了该类的实现Interval,以获得以下MRE

间隔.h

#pragma once
#ifndef INTERVAL_H_INCLUDED
#define INTERVAL_H_INCLUDED

namespace utils {

    template <class T> class IntervalIter;

    //-----------------------------------------------------------------------------
    // Interval
    //-----------------------------------------------------------------------------

    template <class T>
    class Interval {
    public:
        Interval();
        Interval(const T value);
        virtual ~Interval();

        ///< iterator
        friend class IntervalIter<T>;
        typedef IntervalIter<T> iterator;
        typedef const IntervalIter<T> const_iterator;
        iterator begin();
        iterator end();
        const_iterator begin() const;
        const_iterator end() const;

    private:
        T value_;
    };

//-----------------------------------------------------------------------------
// IntervalIter
//-----------------------------------------------------------------------------

    template <class T>
    class IntervalIter {
    public:
        IntervalIter(T cur) : _cur(cur) {};

    private:
        T _cur;
    };

//-----------------------------------------------------------------------------
// Interval -- Impl.
//-----------------------------------------------------------------------------


    template <class T>
    Interval<T>::Interval(const T value)
        : value_(value)
    {
        // nothing to do
    }

    template <class T>
    Interval<T>::~Interval()
    {
        // nothing to do
    }

    template <class T>
    typename Interval<T>::iterator Interval<T>::begin()
    {
        return this->value_;
    }

    template <class T>
    typename Interval<T>::iterator Interval<T>::end()
    {
        return this->value_;
    }

    template <class T>
    typename Interval<T>::const_iterator Interval<T>::begin() const
    {
        return const_cast<Interval<T>*>(this)->begin();
    }

    template <class T>
    typename Interval<T>::const_iterator Interval<T>::end() const
    {
        return const_cast<Interval<T>*>(this)->end();
    }


} // namespace utils
#endif
#pragma once
Run Code Online (Sandbox Code Playgroud)

主程序

#include "interval.h"

template class utils::Interval<int>;

int main(int argc, char* argv[])
{
    utils::Interval<int> values(10);
}
Run Code Online (Sandbox Code Playgroud)

问题似乎出在这里:

    template <class T>
    typename Interval<T>::const_iterator Interval<T>::begin() const
    {
        return const_cast<Interval<T>*>(this)->begin();
    }

    template <class T>
    typename Interval<T>::const_iterator Interval<T>::end() const
    {
        return const_cast<Interval<T>*>(this)->end();
    }
Run Code Online (Sandbox Code Playgroud)

按如下方式重写它可以消除错误:

    template <class T>
    typename const IntervalIter<T> Interval<T>::begin() const
    {
        return const_cast<Interval<T>*>(this)->begin();
    }

    template <class T>
    typename const IntervalIter<T> Interval<T>::end() const
    {
        return const_cast<Interval<T>*>(this)->end();
    }
Run Code Online (Sandbox Code Playgroud)

问:

  • 到底是怎么回事?我定义const_iterator错误了吗?
  • 有比我找到的解决方案更好的解决方案吗?

注意:我忘了提及,我只能使用之前可用的所有 C++ 功能stdc++11