C++ &引用;typename限定id“;在非类型参数声明中引用类型 14.1[温度参数],第2段

C++ &引用;typename限定id“;在非类型参数声明中引用类型 14.1[温度参数],第2段,c++,language-lawyer,C++,Language Lawyer,typename后跟一个非限定id命名模板类型参数typename后跟限定id表示非类型参数声明中的类型 我对粗体字的意思有点困惑。具体来说,typename可以出现在两种不同的上下文中(类型说明符或模板参数),但这指的是哪一种 对于前一种情况,我认为: struct A { struct X { }; int X; }; struct B { struct X { }; }; template<class T> void f(T t) { type

typename
后跟一个非限定id命名模板类型参数
typename
后跟限定id表示非类型参数声明中的类型

我对粗体字的意思有点困惑。具体来说,
typename
可以出现在两种不同的上下文中(类型说明符或模板参数),但这指的是哪一种

  • 对于前一种情况,我认为:

    struct A {
        struct X { };
        int X;
    };
    struct B {
        struct X { };
    };
    template<class T> void f(T t) {
        typename T::X x;    // T can be A or B
    }
    
    结构A{ 结构X{}; int X; }; 结构B{ 结构X{}; }; 模板空隙f(T){ typename T::X;//T可以是A或B } 但是,
    A::X
    B::X
    都不是非类型参数声明(它们是成员声明)

  • 对于后一种情况,我不知道为什么有必要这样做。为什么不直接用限定id写下它的类型?参数化是必要的吗

    • 这是关于

      struct S { typedef int X; };
      template <typename T, typename T::X> void f() { }
      int main() { f<S, 1>(); }
      
      struct S{typedef int X;};
      模板void f(){}
      int main(){f();}
      
      这里,
      typename T
      意味着
      T
      是一个命名的模板类型参数,而
      typename T::X
      是一个未命名的非类型模板参数的类型

      类型参数是用于模板类型参数的语法,参数声明是用于模板非类型参数的语法

      typename T
      不能在参数声明中解析为typename说明符,因为它缺少嵌套的名称说明符,因此必须是类型参数

      typename T::X
      不能被解析为类型参数,因为它只允许在
      typename
      关键字之后有一个标识符,所以它必须是一个参数声明

      我认为没有歧义,但本文澄清了这两个模板参数的解析方式有多不同。

      typename后跟一个非限定id将命名模板类型参数。typename后跟一个限定id表示非type131参数声明中的类型

      示例:使用g++-std=c++2a编译

      #include<iostream>
      using namespace std;
      
      namespace X {
          struct S {
          int i;
          };
      }
      
      #包括
      使用名称空间std;
      名称空间X{
      结构{
      int i;
      };
      }
      
      typename X::S是声明非类型模板参数的限定id

      template< typename X::S &N,typename T>
          void fun(T a) {
          cout << "non-type paramet N.i = " << N.i << endl;
          cout << "type paramet a = " << a << endl;
      }
      
      X::S  x{ i:10 };
      int main() {
          fun<x,int >(5);
      }
      
      T是未限定的id名称模板参数

      template< typename X::S &N,typename T>
          void fun(T a) {
          cout << "non-type paramet N.i = " << N.i << endl;
          cout << "type paramet a = " << a << endl;
      }
      
      X::S  x{ i:10 };
      int main() {
          fun<x,int >(5);
      }
      
      模板
      虚无乐趣(T a){
      
      cout“参数声明”仍然困扰着我…你能详细说明一下吗?@Il seobBae我不明白你没有得到哪一部分,你能在你的问题上更具体一点吗?
      typename t
      typename t::X
      都是模板参数的声明,如果这有帮助的话。模板参数可以是类型参数或参数声明,显然两者都是
      typename T
      typename T::X
      是类型参数。粗体文本要求类型必须在参数声明中,我不确定代码中的哪个语法单元是参数声明。@Il seobBae我现在理解了您的问题,最初做了一个错误的编辑来覆盖它。我会尝试更好地编辑。请放心时间到了!我真的很感激你的关注。