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。
| 归档时间: |
|
| 查看次数: |
549 次 |
| 最近记录: |