在模板中使用时C4100“未引用的形式参数”

时间:2013-01-07 20:33:58

标签: c++ templates visual-c++ compiler-warnings visual-c++-2012

这看起来很简单,不应该是一个问题,但我没有看到它,所以任何帮助都会受到赞赏。

我有一个带参数的函数,然后在模板中使用该参数。编译器(Visual C ++ 2012)正在生成一个C4100“Unreferenced Formal Parameter”警告..​​....这很烦人。我不明白为什么它认为参数是未引用的。

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

我原以为“工厂”很明显被引用,因为它的“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);
}

代码功能正常,它只是发出一个我不明白的警告。请注意,在我的实际代码中,宏和函数位于不同的项目和不同的文件中,但为了简单起见,它们一起包含在这里。

1 个答案:

答案 0 :(得分:2)

基于instance名称,factory可能是单身,instance是静态函数。在这种情况下,factory的值确实从未使用过,你可以直接在类上调用函数,这实际上是编译器所做的事情:

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

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