2011-04-23 2 views
3

C++ 템플릿을 사용하여 궁극적으로 호출되지 않는 함수가 포함 된 라이브러리와의 연결을 피할 수 있습니까? 예를 들어, 다음과 같은 코드 :연결을 피하기 위해 cpp 전 처리기 대신 템플리트?

template <typename T> 
struct Foo { 
    void bar() { zod(); } 
}; 

int main(int argc, char *argv[]) 
{ 
    return 0; 
} 

GCC 4.5을 거부합니다 : 오류 : 템플릿 매개 변수에 따라 '조드'에 인수, 그래서 '조드'의 선언이 가능해야이 없습니다 참고 : ('-fpermissive'를 사용하면 G ++에서 코드를 허용하지만 선언되지 않은 이름의 사용은 권장되지 않습니다.)

여기에 표준으로 오류가 있습니까? 템플릿을 사용하여이를 달성하는 방법이 있습니까? 따라서 cpp 매크로는 사용하지 마십시오.

답변

4

나는 (예를 들어, 헤더 파일을 포함하여, 즉 선언을) 당신이 프로토 타입 zod()에 대한에게 제공과을 연결 을 혼동하고 생각합니다.

많은 구현은 정의없이 함수를 호출하는 함수 (또는 템플릿)가있는 프로그램을 행복하게 컴파일하고 연결합니다. 그래서,이 (적어도 MSVC 10, GCC 4.3과 GCC 4.5) 잘 작동합니다 :

void zod(); // we need the declaration, but no definition 

inline void bar() { zod(); } 

int main(int argc, char *argv[]) 
{ 
    return 0; 
} 

나는 경우 표준 의무가 있지만 확실하지 않다. 물론 템플릿이 구체화되지 않는 한 inline 대신 템플릿을 사용해야합니다.

+0

+1. 그 일로 결코 호출되지 않는 비 인라인 함수는 많은 링커에 의해 제거되어 아무런 문제가 발생하지 않습니다. 나는 또한 표준 상태에 대해 확신하지 못한다 ... "odr-used"와 관련이있을 것이다. – Potatoswatter

+0

MSVC 10 인라인 없이는 작동하지 않는다고 말할 수 있습니다. –

+0

이것은 좋아 보인다. Digital Mars Compiler 8.42n을 사용하여 템플릿과 인라인 모두에서 작동합니다. GCC 4.5 및 4.6. – user2023370

1

코드의 특수화가 필요한 예제는 표시하지 않았습니다. 이 경우 단순히 함수 inline을 선언 할 수 있습니다.

내가보기에는 더 이상 의문이들 수도 있습니다. 그렇다면 질문을 수정하고 자세한 내용을 제공하십시오.

2

오류가 의미하는 것처럼 zod()이 템플릿 매개 변수에 종속 된 경우 SFINAE는이를 문제가 아닌 것으로 표시합니다.

약자로, zod의 선언을 사용할 수 있어야합니다. 죄송합니다.

template <typename T, T dummy> 
struct Foo { 
    void bar() { zod(dummy()); } 
}; 

int main(int argc, char *argv[]) 
{ 
    return 0; 
} 

하지만 ... 주요 EW : 당신이 zod의 제어를했고 그것에 더미 매개 변수를 추가 상관하지 않은 경우

, 당신이 뭔가를 할 수 있습니다.

+0

감사합니다. 사실 나는 선언을 할 수 있습니다. 정의가 아닙니다. – user2023370

+0

@ user634722 : 아하, 기쁨 : –