返回该类中定义的类型的类模板的成员函数的正确语法是什么?

时间:2011-03-24 16:47:49

标签: c++ templates stl

我目前正在使用Accelerated C ++,我仍然坚持练习11-6。我们的想法是将标准库向量重新实现为一个名为Vec的类。

我遇到了iterator erase(iterator)成员的问题,因为在类定义之外我不知道正确的语法,并且我尝试的所有内容都会导致编译错误。我目前的代码是:

template <class T> T* Vec<T>::erase(T* pos){

    if(pos < avail)
        std::copy(pos + 1, avail, pos);

    --avail;
    alloc.destroy(avail);

    return pos;

}

这完美无缺。但是,出于可维护性目的以及与stl中的算法的兼容性,我知道我应该做这样的事情:

template <class T> Vec<T>::iterator Vec<T>::erase(Vec<T>::iterator pos){

    // As before

}

我已经在类定义中定义了iterator,如下所示:

 typedef T* iterator;

尝试使用第二个代码段进行编译会导致:

D:\Documents\Programming\Accelerated C++\Chapter 11>cl /EHsc Vec.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

Vec.cpp
Vec.cpp(23) : warning C4346: 'Vec<T>::iterator' : dependent name is not a type prefix with 'typename' to indicate a type
Vec.cpp(23) : error C2143: syntax error : missing ';' before 'Vec<T>::erase'
Vec.cpp(23) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Vec.cpp(23) : fatal error C1903: unable to recover from previous error(s); stopping compilation

可悲的是,警告对我来说没有多大意义,在阅读MSDN page for it之后,我无法看到它如何适用于我的代码。

其余消息显示为编译器无法识别返回类型。

我尝试了很多不同的组合,但搜索并不是很有帮助。我将不胜感激任何帮助。谢谢!

2 个答案:

答案 0 :(得分:7)

  template <class T> 
  typename Vec<T>::iterator Vec<T>::erase(typename Vec<T>::iterator pos){
 //^^^^^^^^ note this                      ^^^^^^^^ note this as well!

       //your code!
  }

也就是说,两个地方需要typename。这是因为iterator是一个从属名称,因此需要typename

在Stackoverflow本身上阅读这个名为Johannes的好人的优秀解释:

阅读完之后,您还可以阅读以下主题:


与其他好文章的链接:

答案 1 :(得分:3)

template <class T> typename Vec<T>::iterator Vec<T>::erase(typename Vec<T>::iterator pos){

    // As before

}

...因为迭代器在这里是模板参数的名称​​ dependent “没有typename编译器假装认为Vec :: iterator是Vec的静态成员:)