0

因此,在我的 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.

4

0 回答 0