Constexpr函数返回std :: array未被编译器

时间:2015-08-06 04:18:37

标签: templates c++11 constexpr stdarray

所以在我的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进行编译。

0 个答案:

没有答案