そのため、私の C++11 プロジェクトでは、クラス テンプレート パラメーターに基づいて、特定の特性テンプレートの特殊化をエイリアスしようとしています。これは、CRTP を使用してテンプレートから継承し、特殊化に使用される型を参照する必要なく、特性テンプレートのメンバーにアクセスできるようにすることを目的としています。
改善された最小限の例:
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 を格納するだけで、エラーなしでアクセスできます。その結果、コンパイラが constexpr 指定子を無視し、実行時に呼び出されるようにするため、MakePinArray テンプレート関数に何か問題があると推測しているため、未定義の参照エラーが発生します。
ただし、この回答の2番目の提案など、他の回答を見てきました: C++ 11でN要素のconstexpr配列を作成し、彼のbuild_array関数と私の間の機能的な違いを検出できません。
誰でも a) 私の理解が正しいことを確認できますか (つまり、constexpr 指定子が破棄され、RowPins の宣言はあるが定義はありません)、b) これを修正する方法を提案できますか?
役立つ場合の詳細情報として、私は VisualGDB/arm-gcc 4.9.2 を使用し、 でコンパイルしてい-std=c++11
ます。