因此,在我的 C++11 项目中,我试图根据类模板参数对特定的特征模板专业化进行别名。这是为了让我可以从模板继承,使用 CRTP,并访问特征模板的成员,而无需引用用于专门化它的类型。
改进的最小示例:
主文件
#include "Matrix.h"
#include "MatrixImplementation.h"
int main()
{
HAL_Matrix<NXP_HAL_Matrix>().Scan();
return 0;
}
矩阵.h
#pragma once
#include <array>
template <uint8_t ... Pins>
static constexpr std::array<uint8_t, sizeof...(Pins)> MakePinArray()
{
return (std::array<uint8_t, sizeof...(Pins)> { { Pins... } });
};
template <class HAL_Matrix_Implementation>
struct MatrixTraits
{
};
template <>
struct MatrixTraits<class HAL_Matrix_Implementation>
{};
template <class HAL_Matrix_Implementation>
class HAL_Matrix
{
public:
using MatrixParameters = ::template MatrixTraits<HAL_Matrix_Implementation>;
void Scan()
{
auto test = MatrixParameters::RowPins;
auto test2 = MatrixParameters::ColumnPins;
};
};
矩阵实现.h
#pragma once
#include "Matrix.h"
#include <array>
#include <stdint-gcc.h>
class NXP_HAL_Matrix : public HAL_Matrix<NXP_HAL_Matrix>
{
public:
void Scan() {};
void Initialize() {};
};
template <>
struct MatrixTraits<NXP_HAL_Matrix>
{
public:
static constexpr auto RowPins = MakePinArray<1,2,3>();
static constexpr auto ColumnPins = 3;
};
在编译时,我收到以下错误:
Debug/main.o: In function `HAL_Matrix<NXP_HAL_Matrix>::Scan()':
<path>\Matrix.h(31): error VGDB1000: undefined reference to `MatrixTraits<NXP_HAL_Matrix>::RowPins'
在准备这个最小示例时,我发现我访问 RowPins 的尝试给出了一个未定义的引用,但是在 ColumnPins 中只存储一个 int 意味着我可以毫无错误地访问它。结果,我假设我的 MakePinArray 模板函数有问题,因此编译器忽略了 constexpr 说明符,并允许在运行时调用它,因此出现未定义的引用错误。
但是,我查看了其他答案,例如此答案中的第二个建议:Create N-element constexpr array in C++11 and can't detect a function difference between his build_array function and mine。
任何人都可以a)确认我的理解是正确的(即 constexpr 说明符被丢弃,导致有一个 RowPins 声明但没有定义)和 b)建议我如何纠正这个问题?
如果它有帮助,只是为了获得更多信息,我正在使用 VisualGDB/arm-gcc 4.9.2 并使用-std=c++11
.