这看起来很简单,不应该是一个问题,但我没有看到它,所以任何帮助都会受到赞赏。
我有一个带参数的函数,然后在模板中使用该参数。编译器(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);
}
代码功能正常,它只是发出一个我不明白的警告。请注意,在我的实际代码中,宏和函数位于不同的项目和不同的文件中,但为了简单起见,它们一起包含在这里。
答案 0 :(得分:2)
基于instance
名称,factory
可能是单身,instance
是静态函数。在这种情况下,factory
的值确实从未使用过,你可以直接在类上调用函数,这实际上是编译器所做的事情:
Factory::instance().Register(...);
然后你可以完全删除参数,并且你将避免明显的编译器错误,它将参数的使用与参数值的使用混为一谈。