目次
(C++11)テンプレート使用時の primary-expression token なビルドエラー対応方法メモ
C++11のテンプレートメソッド内で別のテンプレートを呼び出している箇所で、特定のコンパイラでコンパイル時に error: expected primary-expression before '>' token なエラーが出た場合の解決方法メモです。 // テンプレートなクラス template<typename T1> class TemplateClass { public: template<typename T2> T2 func() { return T2(); } }; // テンプレートな関数 template<typename T1, typename T2> void templateFunction() { TemplateClass<T1> t; t.func<T2>(); // < ここでエラーがでます } // templateFunctionをコール void main() { templateFunction<int,float>(); } 上記のコードをビルドするとこんなエラーが出ます。 hoge.cpp: In function 'void templateFunction()': hoge.cpp:xxx:xxx: error: expected primary-expression before '>' token t.func<T2>(); ^ hoge.cpp:xxx:xxx: error: expected primary-expression before ')' token t.func<T2>(); ^ templateFunction()内の t.func<T2>(); を以下のように書き換えるとビルドエラーが解消されます。 t.template func<T2>(); staticなメンバ変数の初期化
Hoge.h class Hoge { public: static func(); private: static std::vector<int> m_vector; static std::bitset<16> m_bitset; static int m_array[16]; }; Hoge.cpp Hoge::func() { m_vector.clear(); m_bitset.reset(); m_array[0] = 0; } という風にしてしまうと、LNK2001の外部参照が未解決リンクエラーが出てしまいます。 std::vector<int> Hoge::m_vector; std::bitset<16> Hoge::m_bitset; int Hoge::m_array[16]; を追記して、暗黙の初期化を行うようにすればリンクエラーは解消されます。 クラスのメンバ関数ポインタをアップキャストして使用する
宣言部 class FuncClassBase; typedef void (FuncClassBase::*FuncClassCallback)(); class FuncClassBase { public: FuncClassCallback m_callback; }; class FuncClassA : public FuncClassBase { int a; public: FuncClassA() { a = 99; } void funcA() { printf( "funcA %d\n", a ); } }; 実装部 FuncClassBase funcClassBase; FuncClassA funcClassA; // static_castすればFuncClassBaseの関数ポインタ型のFuncClassCallbackにFuncClassAの関数ポインタを代入する事ができる FuncClassCallback fc = static_cast<FuncClassCallback>(&FuncClassA::funcA); (funcClassA.*fc)(); // これは安全 (funcClassBase.*fc)(); // これは危険。やっちゃだめ // このやり方も大丈夫 funcClassA.m_callback = static_cast<FuncClassCallback>(&FuncClassA::funcA); (funcClassA.*funcClassA.m_callback)(); クラスのメンバ関数ポインタのエラーに関するメモ
class Hoge { public: void (Hoge::*m_func)(void); void Call() { this->m_func = &Hoge::Func; (this->*m_func)(); } void Func(void) { printf("func\n"); } }; 下記のエラーは error C3867: 'Hoge::Func': function call missing argument list; use '&Hoge::Func' to create a pointer to member こうやると、 this->m_func = Func; 出るエラーなので、 this->m_func = &Hoge::Func; こうする。 templateクラス内templateクラスのstaticメンバ変数を初期化する
templateクラス内のtemplateクラスのstaticメンバ変数に初期値を入れたい場合、 template <typename T1> class Hoge1 { template< typename T2 > class Hoge2 { static int id_; // これを初期化したい時 }; }; ↓こんな風に書けば初期値を入れられる。 template<typename T1> template<typename T2> int Hoge1<T1>::Hoge2<T2>::id_ = (sizeof(T1) * sizeof(T2)); オペレータ
TIPS
|