C4100 «Формальный параметр без ссылок» при использовании в шаблоне

Это кажется настолько простым, что это не должно быть проблемой, но я не вижу этого, поэтому любая помощь будет принята с благодарностью.

У меня есть функция, которая принимает параметр, а затем использует этот параметр в шаблоне. Компилятор (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);
}

Код работает нормально, просто выдает предупреждение, которое я не понимаю. Обратите внимание, что в моем реальном коде макрос и функция находятся в разных проектах и ​​в разных файлах, но они были включены здесь вместе для простоты.

3

Решение

На основе instance имя, похоже factory может быть синглтон, и instance это статическая функция. В этом случае значение factory действительно никогда не используется, и вы можете вместо этого вызывать функцию непосредственно в классе, что, по сути, в любом случае делает компилятор:

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

Затем вы можете полностью удалить параметр и избежать явной ошибки компилятора, которая связывает использование параметра с использованием значения параметра.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]