質問: そうしたい理由というのは、現在あるクラス(class Hogeとします)をシングルトンとしているのですが、「public:」の次の行の関数のみHoge.cppを参照し、以降の行はmain.cppを参照しているようなのです。定義に移動(F12)で確認しています。そのせいで「関数定義が見つかりません」と怒られます(なのにLINL2019エラーは出ないし実行もできる謎)。 もっと謎なのが、この問題が起こるクラスと起こらないクラスがあり、クラス名は違えど全く同様の記述でも起きるときと起こらないときがありますので謎は深まるばかりです。 また、シングルトンにしているクラス名は以下のようにdefineで定義したマクロを使用するようになっています。 ``` #define SINGLETON_CLASS(T) class T ``` このマクロを使用せずclass Hogeとした場合は正常に動作しました。 しかし諸事情によりこの仕様は必ずしなければならず、class Hogeと書けばよいでは済みません。というか、単にclass Tに置き換えているだけなのになぜ問題が起きたりしたりしなかったりするのかも謎です。 題目の解決策としてクラスビュー(クラスダイアグラム)を使用してみましたが、問題の箇所がクラスビューに無いので確認が出来ていません。 【今まで試した解決策と結果】 ・プロジェクト丸々作り直し : 失敗 ・suoファイルの削除->再生成 : 失敗 ・関数の順番を変える : 失敗(結局public:次行のみ正常動作) ・クラス名を変える : 失敗 上記諸々の事情があり、題目に至った次第です。 よろしくお願いいたします。 --- @sayuri さん「現象が再現する範囲で可能な限り簡素化したコードを提示してもらえませんか」に対するコード提示 ``` //Hoge.h #define DEFINETEST(T) class T DEFINETEST(Hoge) { template class HogeTemplate { //略 }; public: void TestFunc1();//この行は正常に関数定義を見る void TestFunc2();//この行以降では関数定義を見つけられない }; //Hoge.cppはTestFunc1とTestFunc2関数しかないものとする ```
回答: まず印象としては、対象マクロが原因であると特定できる場合、 省略しますが、それを排除するのが合理的であるとする理由は多数見つかります。 症状についてですが、 1.クラスビューもインテリセンスも同じシンボルDB(pdb)を参照していると予測できるので、同じ結果になるでしょう。 2.経験上、特に#defineマクロについては「定義へ移動」等が苦手なようだという感想を持っています。同一であればどこに書いてもOKですし。 どのヘッダーを見ているか知りたいということに関しては、 3.開示したいヘッダーファイルの行、例えば #include "foo.h" 等の行で右クリックし、表示されるコンテキストメニューから「ドキュメント"foo.h"を開く」を選択すると、インクルードパスにてらした該当ファイルが開きます。 これを「名前を付けて保管」しようとすれば、ファイルのロケーションがわかります。 もし可能であれば、 4.この不自然なマクロの意味がうまく推察できなかったのですが、typedef、template、等で置き換えられるなら、その方がC++言語的には自然です。 個人的には、その言語の本質的な識別子を置換するのには強い違和感を持ちます(デバッグ用は許容しますが)。