神之浪子 2022-02-23 09:43 采纳率: 50%
浏览 25
已结题

c++ auto decltype 模板

使用模板类编写一个容器打印的代码:

template<class T>
class P_STL
{
public:
    void print(T &t)
    {
        for (mit = t.begin();mit != t.end();mit++)
        {    
            cout << *mit << endl;
        }
    }
private:
    //T::iterator mit;      //error
    //auto mit = T().begin();    //error
    decltype(T().begin()) mit;    //OK
};

问题有三个:
1、T()代表什么,为什么能正常使用?
2、第一个error能理解,T不是个具体类型;第二个为什么error?
3、decltype的ok和auto error的原因和区别是什么

  • 写回答

2条回答 默认 最新

  • _GX_ 2022-02-23 14:15
    关注
    1. decltype(expression)是用来推导expression表达式的类型,expression并不会真正被执行,只用来推导类型,但是表达式必须是合法的表达式。
      因此,decltype(T().begin())中,T()相当于构造一个类型为T的临时对象,T().begin()返回这个临时对象的迭代器,因为整个表达式的类型就是容器T的迭代器类型。
      https://en.cppreference.com/w/cpp/language/decltype

    2. 如果你要用第一种写法,前面要加typename,即typename T::iterator mit;
      目前C++标准不支持非静态成员变量声明为auto,这中间缘由比较复杂,如果你感兴趣,可以看看下面帖子
      https://cor3ntin.github.io/posts/auto_nsdmi/

    其实你可以在print()函数里直接用auto mit = t.begin();,编译器会自动推导mit的类型

    void print(T &t)
    {
        for (auto mit = t.begin(); mit != t.end(); ++mit)
            cout << *mit << endl;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月3日
  • 已采纳回答 2月23日
  • 创建了问题 2月23日

悬赏问题

  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答