g ++-4.6から4.7に切り替える必要がありました(C ++ 11の機能をいくつか使用できるようにするため)。今、コンパイラは文句を言います:
In function WordJIT<float>::WordJIT(): undefined reference to JitRegType<float>::Val_t
これらのコンパイラバージョン間で、シンボルの解決に影響を与える可能性のある変更があったかどうか疑問に思っています。または、言語は新しいバージョン(4.7)でより適切に実装されており、私が行っていることは間違っています:(同じコードが4.6でコンパイルされます)
jit.h
class Jit {
public:
enum RegType { f32=0,f64=1,u16=2,u32=3,u64=4,s16=5,s32=6,s64=7 };
// ...
};
template <class T> struct JitRegType {};
template <> struct JitRegType<float> { static const Jit::RegType Val_t = Jit::f32; };
wordjit.h
#include "jit.h"
template<class T>
class WordJIT
{
WordJIT() {
mapReg.insert( std::make_pair( JitRegType<T>::Val_t , jit.getRegs( JitRegType<T>::Val_t , 1 ) ) );
}
private:
typedef std::map< Jit::RegType , int > MapRegType;
mutable MapRegType mapReg;
};
編集:
static const
ヘッダーファイルで大丈夫ですか、それとも使用する必要がありますかconstexpr
?
Val_t
のクラス宣言でも宣言する方法はありJitRegType
ますが、実際には定義しませんか?