所以在我的C ++ 11项目中,我试图根据类模板参数为特定的特征模板特化提供别名。 这是为了使我可以使用CRTP继承模板,并访问traits模板的成员,而无需引用用于专门化的类型。
改进的最小例子:
的main.cpp
#include "Matrix.h"
#include "MatrixImplementation.h"
int main()
{
HAL_Matrix<NXP_HAL_Matrix>().Scan();
return 0;
}
Matrix.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;
};
};
MatrixImplementation.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并且无法检测到他的build_array函数与我的函数之间的功能差异。
任何人都可以a)确认我的理解是正确的(即constexpr说明符被丢弃,导致RowPins声明但没有定义)和b)建议我如何纠正这个?
只是为了获得更多信息,如果它有用,我正在使用VisualGDB / arm-gcc 4.9.2并使用-std=c++11
进行编译。