C++リフレクションメソッドを試していて、プリプロセッサマクロの理解に問題があります。たとえば、次のコードが動作します。定数付きプリプロセッサマクロの理解
がheader.h:
#define META_PROPERTY(NAME, TYPE, ACCESS, MIN, MAX) \
class NAME##_MetaProperty : public sge::GetSet<TYPE> \
{ \
public: \
NAME##_MetaProperty(TYPE *NAME) \
: GetSet(NAME, ACCESS) \
, min_(MIN) \
, max_(MAX) \
{} \
. . . other methods . . .
private: \
TYPE min_; \
TYPE max_; \
}NAME##_prop(&NAME); \
main.cppに
main
{
uint32 u(255);
META_PROPERTY(u, uint32, ACCESS_DEFAULT, 0, 1024);
...
}
マクロは喜んで不完全なコンストラクタにもかかわらず、NAME ## _メタプロパティオブジェクトを作成し、私は、プリプロセッサは、単にいっぱい以来、私は理由を理解推測しますMINのMAXパラメータ。しかし、コンストラクタを次のように変更すると、コンパイルエラーが発生します。
public: \
NAME##_MetaProperty(TYPE *NAME, TYPE MIN, TYPE MAX) \
: GetSet(NAME, ACCESS) \
, min_(MIN) \
, max_(MAX) \
{} \
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2143: syntax error: missing ')' before 'constant'
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2143: syntax error: missing ';' before 'constant'
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2059: syntax error: 'constant'
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2059: syntax error: ')'
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2334: unexpected token(s) preceding ':'; skipping apparent function body
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2059: syntax error: '&'
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): warning C4183: 'u_prop': missing return type; assumed to be a member function returning 'int'
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(45): error C2059: syntax error: '='
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(45): error C2238: unexpected token(s) preceding ';'
定数をあらかじめ定義しておけば、別の小さなエラーが発生します。
main
{
const uint32 min(0);
const uint32 max(1024);
META_PROPERTY(u, uint32, ACCESS_DEFAULT, min, max);
}
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): error C2664: 'main::u_MetaProperty::u_MetaProperty(const main::u_MetaProperty &)': cannot convert argument 1 from 'uint32 *' to 'const main::u_MetaProperty &'
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): note: Reason: cannot convert from 'uint32 *' to 'const main::u_MetaProperty'
1>d:\projects\sgesuite\tests\test04-reflection\src\main04.cpp(44): note: No constructor could take the source type, or constructor overload resolution was ambiguous
MINとMAXをコンストラクタで渡すことができない理由を理解しようとしています。このマクロは私の定数で何をしていますか?
この時点で、私は動作するコードに行きます。ありがとう。 – JimK