Это кажется настолько простым, что это не должно быть проблемой, но я не вижу этого, поэтому любая помощь будет принята с благодарностью.
У меня есть функция, которая принимает параметр, а затем использует этот параметр в шаблоне. Компилятор (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:« фабрика »: формальный параметр без ссылки»
Я бы подумал, что на «фабрику» явно ссылаются, так как ее функция «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);
}
Код работает нормально, просто выдает предупреждение, которое я не понимаю. Обратите внимание, что в моем реальном коде макрос и функция находятся в разных проектах и в разных файлах, но они были включены здесь вместе для простоты.
На основе instance
имя, похоже factory
может быть синглтон, и instance
это статическая функция. В этом случае значение factory
действительно никогда не используется, и вы можете вместо этого вызывать функцию непосредственно в классе, что, по сути, в любом случае делает компилятор:
Factory::instance().Register(...);
Затем вы можете полностью удалить параметр и избежать явной ошибки компилятора, которая связывает использование параметра с использованием значения параметра.
Других решений пока нет …