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:'工厂':未引用的形式参数”

我会认为“工厂”很明显被引用,因为它的“instance()”函数在宏扩展后被调用了两次。我在这里假设代码扩展为:

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名称,它看起来factory可能是一个单例,并且instance是一个静态函数。在这种情况下,factory确实从不使用 的值,您可以直接在类上调用该函数,这实际上是编译器所做的:

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

然后您可以完全删除该参数,并且您将避免明显的编译器错误,该错误将参数的使用与参数值的使用混为一谈。

于 2013-01-07T21:05:24.367 回答