テンプレートを使用してベクトルを(数学的意味で)実装しようとしています。クラスに標準ベクトル定数を定義したいと思います。私は単純な定数(すべてゼロ、すべてのもの)でそれを行うことができましたが、より困難な単位ベクトル(与えられたインデックスに1つのコンポーネントを設定する以外はすべてゼロ)を定義するのに苦労しています。C++のテンプレートテンプレートクラスのstatic constメンバ変数
私はそれを行うためのエレガントな方法をまだ見つけられませんでした。
#include <iostream>
template<unsigned int tSize, typename tReal>
class Vector {
public:
template<unsigned int tIndex>
static const Vector msUnit;
inline Vector() {}
template<typename...tTypes>
inline Vector (tTypes...pVals) {
set(mReals, pVals...);
}
inline tReal operator[] (unsigned int pIndex) {
return mReals[pIndex];
}
inline const tReal operator[] (unsigned int pIndex) const {
return mReals[pIndex];
}
protected:
template<typename tType>
void set (tReal* pPtr, const tType pVal) {
*pPtr = pVal;
}
template<typename tType, typename...tTypes>
void set (tReal* pPtr, const tType pVal, const tTypes...pVals) {
*pPtr = pVal;
set(pPtr+1, pVals...);
}
tReal mReals [tSize];
};
int main() {
Vector<3,double> lVec = Vector<3,double>::msUnit<2>;
std::cout << "Vector: (" << lVec[0] << ", " << lVec[1] << ", " << lVec[2] << ")" << std::endl;
return 0;
}
をしかし、私はmsUnit
静的なconstメンバテンプレートを定義する方法を発見していない:ここで私はそれを定義したい方法です。
私はこれを試してみました:
template<unsigned int tIndex, unsigned int tSize, typename tReal>
const Vector<tSize,tReal> Vector<tSize,tReal>::msUnit<tIndex>;
しかし、コンパイラ(clang
& gcc
は)文句を言う:ここでは
prog.cc:43:48: error: nested name specifier 'Vector<tSize, tReal>::' for declaration does not refer into a class, class template or class template partial specialization
const Vector<tSize,tReal> Vector<tSize,tReal>::msUnit<tIndex>;
~~~~~~~~~~~~~~~~~~~~~^
prog.cc:43:54: error: expected ';' at end of declaration
const Vector<tSize,tReal> Vector<tSize,tReal>::msUnit<tIndex>;
^
;
prog.cc:43:54: error: expected unqualified-id
は、このテストの実際の例です:http://melpon.org/wandbox/permlink/AzbuATU1lbjXkksX
はに、それも可能です静的constテンプレート変数メンバをテンプレートクラスに持っていますか?そしてもしそうなら、どのように?
さらに、msUnit
テンプレートの初期設定を行う方法を見つける必要があります。
私は、可変テンプレートと経験を持っていない(したがって、これはコメントではなく答えです)が、私は構文は 'テンプレート<符号なしであることを期待したいです Vector :: msUnit ; –
Angew
初期化子に関しては、おそらく再帰を伴います。 – Angew
あなたの提案された定義は実際には何も定義しません。実際にテンプレートを定義するには、実際のテンプレートパラメータ、つまり 'tIndex'、' tSize'、 'tReal'を提供する必要があります。 –