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
.
的必要性
假设我有以下模板化 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
.