【问题标题】:Why do we need typename here?为什么我们在这里需要 typename?
【发布时间】:2010-11-10 12:28:36
【问题描述】:
template<class T>
class Set 
{
public:
   void insert(const T& item);
   void remove(const T& item);
private:
   std::list<T> rep;
}

template<typename T>
void Set<T>::remove(const T& item)
{
   typename std::list<T>::iterator it =  // question here
    std::find(rep.begin(),rep.end(),itme);
   if(it!=rep.end()) rep.erase(it);

}   

为什么需要 remove() 中的 typename?

【问题讨论】:

  • 也许编辑以更清楚地表明您正在谈论的行是 typename std::list::iterator it = std::find(rep.begin(),rep.end( ),itme);因为我认为这是你的意图。

标签: c++


【解决方案1】:

一般来说,C++ 需要typename,因为它继承自 C 的不幸语法 [*],这使得如果没有非本地信息就不可能在 A * B; 中说出 A * B; 是否有 A 名称一个类型(在这种情况下,这是一个将 B 声明为指向它的指针)或不是(在这种情况下,这是一个乘法表达式——因为 A 很有可能,因为你可以在没有非本地信息的情况下知道, 可能是一个类的实例,它重载 operator* 来做一些奇怪的事情;-)。

在大多数情况下,编译器确实具有消除歧义所需的非本地信息(尽管不幸的语法仍然意味着低级解析器需要来自保留符号表信息的高级层的反馈)......但是它没有模板(通常不是,尽管在这种特定情况下,专门化 std::list&lt;T&gt; 以使其 ::iterator 不是类型名称在技术上可能是非法的;-)。

[*] 不仅是我的意见,也是我的同事 Ken Thompson 和 Rob Pikes 的意见,他们正忙于设计和实现一种新的编程语言供内部使用:这种新的编程语言,虽然它的语法主要是类似 C,不会重复 C 的语法设计错误——它是新语言(例如在旧的 Pascal 中),语法足以区分必须命名类型的标识符和不能命名类型的标识符;-)。

【讨论】:

  • 迭代器可能是静态成员变量。默认情况下,编译器假定它是。因此编译器错误。
  • 我认为确认所述语言是否称为“B++”会严重违反商业机密? ;-)
  • 很抱歉让这个死而复生,但 8 年后我很好奇是否有任何关于该编程语言的进一步信息可以透露。虽然我没有屏住呼吸。
  • @user3285991 Ken Thompson 和 Rob Pike 创建了 Go。 2009 年 7 月是其开源发布前四个月。
【解决方案2】:

如果您说的是 typename 与 std::list&lt;T&gt;::iterator 一起使用:

类型名用于说明iterator 是在std::list&lt;T&gt; 类中定义的类型。 如果没有 typename,std::list&lt;T&gt;::iterator 将被视为静态成员。只要依赖于模板参数的名称是类型,就会使用typename。

【讨论】:

    【解决方案3】:

    我认为通常你需要类声明中的类型名/类 T 以及函数定义,因为你可以为函数定义定义完整/部分模板规范。 IE。你可以将你的删除函数专门用于整数、字符串,不管它是什么。因此,在这种情况下,您要告诉编译器“这是通用模板,适用于任何类型”,然后您可能会定义仅针对整数指定的相同函数。

    【讨论】:

    • 啊,这个答案对那个澄清无效,对不起!
    【解决方案4】:

    你的'it'声明中需要typename,否则编译器不知道它是一个类型声明而不是一个表达式。

    根据this page,“如果您有一个引用类型并依赖于模板参数的限定名称,请使用关键字 typename。”

    【讨论】:

      猜你喜欢
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2012-06-03
      • 1970-01-01
      • 2021-08-27
      • 2019-06-09
      • 1970-01-01
      相关资源
      最近更新 更多