嵌套类中的类实例化

class instantiation in nested classes

本文关键字:实例化 嵌套      更新时间:2023-10-16

我有以下问题:

template< typename T, size_t N, size_t... N_i >
struct A
{
  // nested class
  template< typename... Ts >
  class B
  {
      //...
      A<T, N_i...>::B< Ts... > operator[]( size_t i )
      {
        A< T, N_i...>::B< Ts... > res{ /* ... */ };
        return res;
      }
      // ...
  };
};

不幸的是,编译器对" A < T, N_i...>::B < Ts... > res{ /* ... */ }; "产生一个错误。有没有人知道我如何在class B的"operator[]"函数中返回class B的实例化(其外部class A的模板参数不同)?

提前感谢。

应该在A<T, N_i...>之前添加一个typename,在B< Ts... >之前添加一个template

我的意思

template< typename T, size_t N, size_t... N_i >
struct A
{
  // nested class
  template< typename... Ts >
  class B
  {
      //...
      typename A<T, N_i...>::template B< Ts... > operator[]( size_t i )
      {
        typename A< T, N_i...>::template B< Ts... > res{ /* ... */ };
        return res;
      }
      // ...
  };
}

注。:也可以在c++ 11中使用;

在返回类型的完整类型之前放置typename是修复您得到的错误的方法。但是,不要把模板形参放在B的后面,因为B总是指向该类型的"当前"实例化。

#include <stdio.h>
using namespace std;
template< typename T, size_t N, size_t... N_i >
struct A
{
  // nested class
  template< typename... Ts >
  class B
  {
      //...
      typename A<T, N_i...>::B operator[]( size_t i )
      {
        typename A< T, N_i...>::B res{ /* ... */ };
        return res;
      }
      // ...
  };
};
https://godbolt.org/g/hsB4pW