(C++11)テンプレート使用時の primary-expression token なビルドエラー対応方法メモ

C++11のテンプレートメソッド内で別のテンプレートを呼び出している箇所で、特定のコンパイラでコンパイル時、
error: expected primary-expression before ‘>’ token
なエラーに悩んでしまったので解決方法をメモします。
今まで見たことないので多分C++11からの仕様だと思います。

コードは以下のような感じになります。


// テンプレートなクラス
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>();
              ^

VisualStudioでは出ずに、gccで出ます。
templateFunction()内の

t.func<T2>();

を以下のように書き換えるとビルドエラーが解消されます。

t.template func<T2>();

Cocos2d-x 3.0 rc0 の開発環境構築手順

Cocos2d-x 3.0 rc0 がリリースされました。
beta2から、そこまで大きな変更は多分ないと思いますが、セットアップ方法やプロジェクト新規作成方法の手順などが少し変わりました。

とりあえずHelloWorldまでの手順をWindows版、Android版共にWikiにまとめました。

ぎじゅつめも – Cocos2d-x開発環境の構築

setup.pyの導入により、前よりわかりやすくなったかもしれませんね。

さて、beta2で作成したプロジェクトをrc0に対応しないと・・・

静的コンストラクタ

クラスの静的コンストラクタを実現する方法を紹介します。
起動時に一度だけ行いたい処理を書く時などに便利です。
ただし、他のstaticなオブジェクトと同じく、初期化順番は保証されない点は注意してください。

ヘッダはこんな感じ。

class Hoge
{
private:
	//! 静的コンストラクタ用のprivateな構造体
	struct Construct
	{
		Construct()
		{
			// ここに初期化処理を書きます
			sm_hoge = 0;
		}
	};
private:
	static Construct	sm_construct;	//!< 静的コンストラクタ
	static int			sm_hoge;
};

cpp側はこんな感じになります。

Hoge::Construct	Hoge::sm_construct;
int				Hoge::sm_hoge = 0;

ご覧のとおり、今回のパターンだとsm_hogeはもともと0で初期化しているので静的コンストラクタで処理している内容に意味はなかったりします。

Evernoteをコードで期間延長する方法

h

『EVERNOTE プレミアムパック 3年版』を購入したのですが、Evernote webのアカウントのところみてもいまいち延長方法がわからず。
ググってみたところ、サイトからアクセスしてコードを入力する必要があるそうです。
以下、手順です。

①まずココにアクセスします。
Evernote | ソースネクストユーザーの皆さん、Evernoteへようこそ!
②コードを入力します。
③ログインします。
④コードの登録完了。

どうやら、コードを入力してもそのまま期間がダイレクトに延長されるのではなく、一旦Evernoteポイントというポイントが貯まる仕組みに変わったようです。
今回購入した『EVERNOTE プレミアムパック 3年版』は、3年分なので『360』ポイントが貯まっていました。
ポイントのままだと、延長処理がされていないので、アカウントのポイントの所から、ポイントを消費してプレミアムの延長を選択しましょう。

早速ポイントのページを確認してみると、1ヶ月は10ポイントで12ヶ月だと120ポイントだそうで・・・。
うーん、これだと1ヶ月刻みで使うタイミングで延長したほうがお得な気がしなくもないような(汗
1ヶ月11ポイントにするとか、12ヶ月は110ポイントにするとかしたほうがいいんではなかろうかと思った今日このごろでした。