3

이렇게 간단하지 않아서 문제가되지는 않지만 보이지는 않습니다. 따라서 도움이 될 것입니다.C4100 템플릿에서 사용할 때 "참조되지 않은 형식 매개 변수"

매개 변수를 사용하는 함수가 있는데,이 매개 변수는 템플릿에 사용됩니다. 컴파일러 (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 : '공장': 참조되지 않은 형식 매개 변수를"

나는 "공장"매우 분명히 함수가 두 번 호출됩니다 "() 예"그것으로 참조하는 것을 생각했을 것이다

매크로 확장 후. 코드가 다음과 같이 확장된다고 가정합니다.

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

인라인 함수 일 수 있습니다. 맞습니까? – Puppy

+1

@DeadMG : 그는 형식 이름 ('# T')을 반복하지 않기를 원한다고 생각합니다. –

+0

인라인은 내가 보여준 것으로부터 제안 될 수 있음을 알고 있지만 기능은 여기서는 예제로 단순화되었습니다. 실제 함수는 인라이닝을위한 후보가 아닙니다. – DigitalInBlue

답변

2

instance 이름을 기반으로하면 factory은 싱글 톤일 수 있으며 instance은 정적 기능입니다. 이 경우, factory의 값은 실제로 사용되지 않습니다, 당신은 대신 컴파일러는 어쨌든 무엇을 본질적으로 클래스에 함수를 직접 호출 할 수

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

그럼 당신은 완전히 매개 변수를 제거 할 수 있으며, 당신은 매개 변수의 사용법과 매개 변수의 사용법을 하나로 모으는 명백한 컴파일러 버그를 피할 수 있습니다.

+0

문제의 눈을 즐겁게 보내주십시오! 좋은 해결책. – DigitalInBlue