C++ 模板的实例 class 作为另一个模板 class 的成员

Instance of C++ template class as a member of another template class

假设我有以下模板化 C++ class

#include <cstdint>      

template <uint32_t NO_POINTS>
class A
{
public:
  struct Point
  {
    float x;
    float y;
  };

  A(const Point (&points)[NO_POINTS])
  {
      for (uint32_t point = 0; point < NO_POINTS; point++) {
          table[point] = points[point];
      }
  }
  
private:
  Point table[NO_POINTS];
};

我想使用此 class 的实例作为以下 class 的私有成员:

#include "A.h"

template <uint32_t NO_LUT_POINTS>
class B
{

public:
  B(A<NO_LUT_POINTS>::Point (&table)[NO_LUT_POINTS]) : lut(table){}

private:
  A<NO_LUT_POINTS> lut;
};

#include "B.h"

int main(int argc, char** argv) {

     B<4> foo({{1326.0, 25.0},   {1601.0, 30.0},   {1922.0, 35.0},   {2293.0, 40.0}});
           
    return 0;
}

我试图编译此代码,但编译器报告以下错误 A<NO_LUT_POINTS>::Point is not a type。我不明白这个错误的原因是什么。谁能给我解释一下为什么编译器报这个错误?

这是模板 classes 中嵌套类型的常见错误。您需要添加 typename 以告诉编译器 Point 是一种类型。

...
public:
  B(typename A<NO_LUT_POINTS>::Point const (&table)[NO_LUT_POINTS]) : lut(table){}
...

除解决您的问题外,请注意 Point 不依赖于 A 的模板参数,因此您不应将其嵌套在 class 中。这将消除添加 typename.

的必要性