はかせのラボ

私の頭の中を書いていく雑記ブログです

プログラミング c2064エラーに時間を溶かされた話

あいさつ

どうも、はかせです。
今回は前回移植したプロジェクトを改造していたら
とあるエラーに遭遇し解決に2時間ほどかかりました。
今回はそのエラーのことを忘れないよう備忘録として残します。

c2064

詳しくはこちらを
docs.microsoft.com
要は関数じゃないものを関数として呼び出そうとしたら出るエラーです。
例えばこんな感じ

int hoge;
hoge();//c2064

まぁ普通ならこんなミスしないですよね。
関数ポインタとか使ってるとごっちゃになりそうですが
まだそんなテクいこと移してないのでその線もありません。

原因はやっぱり・・・

前回まるっと移植ではなく必要不必要を判断して
移植した話をしました。

そしていらないものを切ったということは当然該当部分の削除であったり
動くけど冗長な書き方が発生していたりしたわけですね。
特に今回はあくまでジオメトリインスタンシングの
テストをしたいだけですので
コンポーネントの件はまるごと消してるわけです。

そしてコンポーネントがないので今まで律儀に関数呼び出ししてたとこを
コンストラクタに置き換えたり直で受け取ったりと微妙なマイナーチェンジをしたわけです。
例えばこんなとこは

T* pInfo = mGameObject->GetDXManager()->GetDXRenderDataPool()->GetMesh<T>();

こんな感じに

T* pInfo = mDXManager->GetDXRenderDataPool()->GetMesh<T>();

コンポーネントがないのだからGameObjectも不要ということで消したわけです。
さて小見出しと今まで私のブログを読んでくださった方なら
ぼんやりと察しがついたかもしれません。



分かりましたかね?



では答え合わせです。

正解は

T* pInfo = mDXManager()->GetDXRenderDataPool()->GetMesh<T>();

mDXManagerの後ろに()がついてるorz

理屈は簡単ですよ
さっきの二つを見比べてもらえればわかるんですが

T* pInfo = mGameObject->GetDXManager()->GetDXRenderDataPool()->GetMesh<T>();
T* pInfo = mDXManager->GetDXRenderDataPool()->GetMesh<T>();
//コメントアウト部分だけ消せばいんじゃね?
T* pInfo = m/*GameObject->Get*/DXManager()->GetDXRenderDataPool()->GetMesh<T>();

つまりタイポですw
おかげでmDXManager()という存在しない関数を呼び出してしまったわけですね。

ちなみに

今回遭遇したエラー原因は私のタイポだったわけですが、
タイポ以外にも遭遇する可能性があるそうです。
それは
変数と関数の名前を同じにすること
例えば

int hoge;
int hoge()
{
    return 0;
}

こんな感じでちゃんとした定義をしてもc2064エラーは出るそうです。
同じ名前の場合は変数が優先されるっぽいですね。

あとがき

今回はまたもや私のしょーもないミスで時間が溶けた話でした。

もうやらかしは私のアイデンティティみたくなってますねw
チーム開発の時にチームメンバーにしっかりレビューしてもらい
こういうミスを発見してもらうしかないかもしれませんorz

それでは今回はこの辺でノシ