首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回类中定义的类型的类模板的成员函数的正确语法是什么?

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

Stack Overflow用户
提问于 2011-03-25 00:47:49
回答 2查看 265关注 0票数 1

目前我正在通过Accelerated C++进行工作,我被练习11-6卡住了。其思想是将标准库向量重新实现为一个名为Vec的类。

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

代码语言:javascript
运行
复制
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中的算法的兼容性,我知道我应该这样做:

代码语言:javascript
运行
复制
template <class T> Vec<T>::iterator Vec<T>::erase(Vec<T>::iterator pos){

    // As before

}

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

代码语言:javascript
运行
复制
 typedef T* iterator;

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

代码语言:javascript
运行
复制
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之后,我不能确切地看到它将如何应用于我的代码。

其余的消息看起来好像编译器没有识别出返回类型。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-25 01:00:11

代码语言:javascript
运行
复制
  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是必需的!

阅读这篇由一个叫Johannes的很棒的家伙在Stackoverflow本身上的精彩解释:

在阅读之后,您还可以阅读此主题:

其他好文章的链接:

  • Name binding and dependent names (C++ only)
  • Dependent Names (向下滚动阅读本节-如果阅读完整文章会更好)
票数 7
EN

Stack Overflow用户

发布于 2011-03-25 00:54:48

代码语言:javascript
运行
复制
template <class T> typename Vec<T>::iterator Vec<T>::erase(typename Vec<T>::iterator pos){

    // As before

}

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5422594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档