【问题标题】:Template keyword for dependent types in C++11C++11 中依赖类型的模板关键字
【发布时间】:2012-06-07 00:53:21
【问题描述】:

这是一个更深入的后续: this question

考虑以下代码:

template <typename T>
class A {
 public:
  template <typename T2>
  const T2* DoSomething() { ... }
};

template <typename T>
class B : public A<T> {
 public:
  const int* DoSomethingElse() {
    return this->DoSomething<int>();  // Compiler wants 'template' keyword here:
 // return this->template DoSomething<int>();
  }
};

为什么不编译?我了解标准的相关部分是 14.2/4,但我不确定我是否理解为什么这不起作用的具体细节。有人可以分解该部分中的措辞来解释为什么这不起作用吗?另外,您能否描述一下(一般)在什么情况下可以省略模板关键字?

请注意,在 C++11 中,以下代码编译:

template <typename T>
class A {
 public:
  template <typename T2>
  const T2* DoSomething() { ... }
};

class B {
 public:
  scoped_ptr<A<int>> var_;

  const int* DoSomethingElse() {
    return var_->DoSomething<int>();
  }
};

有什么区别?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    这是因为 C++ 不是上下文无关语法。

    通常,编译器会查看先前声明的符号来确定标记序列DoSomething&lt;int&gt; 中的尖括号是关系运算符还是模板名称的一部分。由于这是一个模板,尚不清楚A&lt;T&gt; 是否会被特化,编译器不能依赖符号表中的先前声明,需要程序员的帮助。

    【讨论】:

      【解决方案2】:

      假设你有这个:

      template <> class A<float>
      {
          int DoSomething;
          // ...
      };
      

      突然间,this-&gt;DoSomething &lt; ... 的表达方式变得非常不同。如果给定的 name 是从属名称,则无法确定它的含义。这就是为什么必须明确说明名称是变量、类型名还是模板。

      【讨论】:

      • @ctta0s: 不...我应该说“变量或函数”,尽管您可以将函数视为函数指针,它变量。 . 在任何情况下,您首先必须知道您的令牌应该是哪种实体,并且只有 then 才能检查它是否正确解析。您不会从可以解析的最佳方式推断令牌的性质。
      猜你喜欢
      • 1970-01-01
      • 2014-12-31
      • 2013-03-26
      • 1970-01-01
      • 2011-02-25
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多