3

これは問題にならないほど単純に思えますが、私はそれを見ていないので、助けていただければ幸いです。

パラメータを受け取り、そのパラメータをテンプレートで使用する関数があります。コンパイラ (Visual C++ 2012) は、C4100 の「参照されていない仮パラメータ」警告を生成しています...これは迷惑です。パラメータが参照されていないと考える理由がわかりません。

#define FactoryRegister(f, T) \
{ \
    shared_ptr<FactoryCreator<T>> creator(new FactoryCreator<T>()); \
    f.instance().Register(#T, creator); \
    f.instance().Register(typeid(T).name(), creator); \
}

void FactoryRegister(hive::Factory& factory)
{
    FactoryRegister(factory, MyClass);
}

これをコンパイルすると、「警告 C4100: 'factory' : 参照されていない仮パラメーター」が生成されます。

「factory」は、その「instance()」関数がマクロ展開後に 2 回呼び出されるため、明らかに参照されていると思います。ここでは、コードが次のように展開されると仮定します。

void FactoryRegister(Factory& factory)
{
    shared_ptr<FactoryCreator<MyClass>> creator(new FactoryCreator<MyClass>());
    factory.instance().Register("MyClass", creator);
    factory.instance().Register(typeid(MyClass).name(), creator);
}

コードは正常に機能しますが、理解できないという警告が表示されるだけです。私の実際のコードでは、マクロと関数は別のプロジェクトと別のファイルにありますが、簡単にするために一緒に含まれていることに注意してください。

4

1 に答える 1

2

名前に基づいて、シングルトンのinstanceように見え、静的関数です。その場合、 の値は実際には使用されず、代わりにクラスで関数を直接呼び出すことができます。これは基本的にコンパイラが行うことです。factoryinstancefactory

Factory::instance().Register(...);

次に、パラメーターを完全に削除すると、パラメーターの使用法とパラメーターの値の使用法を混同する明らかなコンパイラのバグを回避できます。

于 2013-01-07T21:05:24.367 に答える