gpt4 book ai didi

c++ - 为什么编译器无法区分 typedef 和非 typedef?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:34 37 4
gpt4 key购买 nike

抱歉,标题太长了。

我在类列表中有一个 typedef:

template <typename T>
class List {
// Think of a class Iter_ with ListElem *pCurrentPos and List *pList
typedef const Iter_ const_iterator;

const_iterator cbegin() const;
};

以及在类之外但在头文件内的定义。

template <typename T>
typename List<T>::const_iterator List<T>::cbegin() const {}

这会产生错误 C2373:Redefinition;不同的类型修饰符

我重写了这个函数:

template <typename T>
const typename List<T>::Iter_ List<T>::cbegin() const {}

错误消失了;程序编译正确。 (想想我在这些例子中没有返回任何东西的事实;它与例子无关。)

编译器解释的错误版本是什么,它阻止了第二个版本没有成功编译,我该如何补救?

更多代码

我正在使用 VS2008

我目前正在编写的(更完整的)代码示例:

template <typename T>
class List
{
public:
// Forward declaration.
class Iter_;

private:
/////////////////////////////////////////////////////////
// ListElem
/////////////////////////////////////////////////////////
struct ListElem
{
T data;
// Doubly-linked list.
ListElem *next;
ListElem *prev;
};

class ListException {};

////////////////////////////////////////////////////////
// List Members
////////////////////////////////////////////////////////
// Point to first elem.
ListElem *head_;
// Point to last elem.
ListElem *tail_;

public:
//////////////////////////////////////////////////////////
// Typedefs
//////////////////////////////////////////////////////////
typedef Iter_ iterator;
typedef const Iter_ const_iterator;

//////////////////////////////////////////////////////////
// Iterator class
//////////////////////////////////////////////////////////
class Iter_
{
public:
Iter_( ListElem *pCurr, List *pList )
: pCurr_(pCurr), pList_(pList)
{ }

T& operator*()
{
if( *this == pList_->end() )
throw ListException();
else
return pCurr_->data;
}

private:
ListElem *pCurr_;
List *pList_;
};

iterator begin();
iterator end();

const_iterator cbegin() const;
const_iterator cend() const;
};

template <typename T>
List<T>::List()
: head_(0), tail_(0), size_(0)
{ }

template <typename T>
List<T>::~List()
{
//this->clear();
}

template <typename T>
List<T>::List( List const& other )
: size_(other.size_)
{
//this->clone(other);
}

template <typename T>
List<T>& List<T>::operator=( List const& other )
{
size_ = other.size_;
//this->clone(other);
}

// Compiles ok
template <typename T>
typename List<T>::iterator List<T>::begin()
{
if(!head_)
head_ = new ListElem();
return iterator(head_, this);
}

// Compiles ok
template <typename T>
typename List<T>::iterator List<T>::end()
{
return iterator(tail_, this);
}

// Compiler error
template <typename T>
typename List<T>::const_iterator List<T>::cbegin() const
{
return const_iterator(head_, this);
}

// Compiles ok
template <typename T>
typename const List<T>::Iter_ List<T>::cend() const
{
return const_iterator(tail_, this);
}

最佳答案

我在实例化 cbegin() 时遇到的错误是您将 (const) this 传递给构造函数,该构造函数采用指向列表的非常量指针。

基本上我怀疑这个想法是否可行。

 typedef const Iter_   const_iterator;

关于c++ - 为什么编译器无法区分 typedef 和非 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4472438/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com