嵌套类中的类实例化

时间:2016-10-16 00:22:54

标签: c++ templates c++14 variadic-templates

我有以下问题:

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的函数“class A”中返回operator[]的实例化(其外部class B的模板参数不同)?< / p>

非常感谢提前。

2 个答案:

答案 0 :(得分:2)

在完整类型的返回类型之前放置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

答案 1 :(得分:2)

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

我的意思是

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;
      }

      // ...
  };
}

P.s。:也适用于C ++ 11;不仅仅是C ++ 14