2017-04-04 2 views
1

最小のテストケースを作成して再現しようとしましたが、できませんでした。Visual Studioでエラーメッセージに関数名に大文字を追加する

SetClass機能

m_luaState["MyClass"].SetClass<MyClass, I32>("AddTo", &MyClass::Add);

これへの呼び出しがエラー

これを表示するためにscreenshotをされている追加のMyClass:この問題は、実際には非常に興味深いです

class MyClass 
{ 
public: 
    MyClass(I32 i) : m_i(i), m_j(2*i) 
    { 

    } 

    I32 m_j; 

    void Add(I32 iv) 
    { 
     std::cout << iv + m_i + m_j; 
    } 

private: 
    I32 m_i; 
}; 
+0

Visual Studioではありません。それはシステム関数の本名です。接尾辞 "A"は "ansi"のためのものです。 RegisterClassでF12を押すと、表示されます。 – KonstantinL

+0

F12は私のスクリーンショットの左側の機能に私を連れて行きます。State :: RegisterClass ..また、その関数(m_state)のインスタンスで呼び出しています – TLoe

+0

あなたのエラーメッセージの写真を投稿しないでくださいテキスト。 – molbdnilo

答えて

2

RegisterClass(...)メソッド名がWindows #define RegisterClassに置き換えられています。 ANSIとしてコンパイルするので、RegisterClassのANSIエイリアスはRegisterClassAです(Unicodeをコンパイルする場合はRegisterClassWとなります)。

あなたはそれが現実的な選択肢だ場合、あなたのRegisterClass(...)メソッドの名前を変更相反するWindowsのヘッダー(おそらくないオプション)を排除し、または条件付き#undef RegisterClassあなたRegisterClass(...)方法、のような何かを宣言し、あなたのヘッダーの上部にある可能性があり、次のいずれか

#ifdef RegisterClass 
#undef RegisterClass 
#endif 

競合するシンボルについての追加の参照:RegisterClass function

+0

これは最初のものだった – TLoe

2

あなたが間違っていたことは何もありません。 RegisterClass Windowsの機能とプログラミング時にWindowsがどのようにUnicodeを処理するかが原因です。

linked MSDN referenceの下部にある表を参照すると、Windowsにはほとんどすべての機能が2種類あります。RegisterClassWRegisterClassAと表示されます。 W関数は、すべての文字列と文字がwchar_tのUnicodeビルドに使用されます。 Aバリアントは、通常のchar文字を使用する「ANSI」バリアントです。

ここでの問題は、Windowsは、基本的にはそれがない、使用することをつくのかを決定するためにマクロを使用していることです。この

#ifdef UNICODE 
# define RegisterClass RegisterClassW 
#else 
# define RegisterClass RegisterClassA 
#endif 

プリプロセッサはRegisterClassARegisterClassメンバ関数へのお電話を交換するため、これには問題がありますシンボルが表示され、エラーが発生します。

(または他の適切な場所に)を含めると、RegisterClassマクロの直後に#undefマクロに簡単な解決策があります。もう一つは、RegisterClassの名前をWindowsの機能と衝突しないように変更することです。

+0

実際にはOPの問題です。 WindowsはUnicode OSですが、OPは 'u16string'や' wchar_t'や 'char16_t'の代わりに' string'のような非Unicodeクラスを使います。以前は、ASCIIとUnicodeの両方で同じコードを使用できるようにマクロが使用されていました。今日は - なぜASCIIを使用するのですか? '#undef'を使用する代わりにOPはネイティブフォーマットを使用するか、マクロを使うべきです –

+0

@PanagiotisKanavos他のコメントにコメントしたところで、OPはWindows API関数' RegisterClass'を呼び出すのではなく、全く関係のないメンバ関数同じ名前を持つクラス。 –

+0

それはおそらく第2レベルの地獄でしょう。下位互換性がどのように実装されたかについては、代替コードよりも優れています。つまり、同じコードを保持し、Unicodeが必要な場合、コードページをUTF8に変更する必要があります。これは結局のところ、Unicodeへの移行を助けることを意味していた –

関連する問題