2010-12-30 3 views
2

코드 재사용 및 전문화를위한 하나의 함수를 템플릿으로 만듭니다.C++의 중첩 템플릿

함수 서명은 FooBar가 Foo<BarX>int DoStuff(FooBar &a); 행을 따릅니다. 즉, 미리 typedef 할 수없는 템플릿의 인스턴스입니다.

나는 template <class T> int DoStuff(Foo<T> &a);template <class T> int DoStuff(T &a);을 시도했지만 약간의 도움이되지 않는 일반적인 암호 링커 오류가 발생합니다.

단순한 템플릿 사용에서만 발견되는 이러한 주제에 대한 자습서도 찾을 수 없습니다.

Foo<Bar1> var1; 
int res1 = DoStuff(var1); 
Foo<Bar2> var2; 
int res2 = DoStuff(var2); 
etc. 

나는 불가능한 일을하려고 :

코드는 같이 호출 할 것인가?

답변

3

제안한 코드 : template <class T> int DoStuff(Foo<T> &a);이 작동합니다. 템플릿이있는 구조체/클래스와 마찬가지로 함수의 코드는 함수가 사용되는 곳에 표시되어야합니다 (즉, 함수의 코드는 일반적으로 헤더에 있어야합니다).

+0

템플릿을 헤더로 옮겼습니다. 모든 것이 잘 작동했습니다. 기묘한... – Coder

1

이 문제는 없습니다. 다음은 컴파일 가능한 프로그램의 예입니다.

#include <iostream> 
#include <cstdlib> 

template<typename T> class Foo{}; 
class Bar1{}; 
class Bar2{}; 

template<typename T> int DoStuff(Foo<T>& ref) { return rand(); } 

int main(int argc, char* argv[]) 
{ 
    Foo<Bar1> var1; 
    int res1 = DoStuff(var1); 
    std::cout << "res1 = " << res1 << std::endl; 

    Foo<Bar2> var2; 
    int res2 = DoStuff(var2); 
    std::cout << "res2 = " << res2 << std::endl; 

    return 0; 
} 

무엇을 정확하게 수행하려고합니까? 귀하의 오류가 너무 많은 과부하를 제공하여 여러 유효한 과부하가 발생하는 결과 일 수 있습니다. 따라서 모호합니다. DoStuff(Foo&)DoStuff(T&)에 대한 과부하를 모두 제공합니까? 하나만 사용해보십시오.

1

아니요, 템플릿 특수화로 완벽하게 가능합니다.

#include <iostream> 

template <typename T> 
class Foo {}; 

template <typename T> 
void DoStuff(const T& val) 
{ 
    std::cout << val << std::endl; 
} 

template <typename T> 
void DoStuff(const Foo<T>& val) 
{ 
    std::cout << "Sorry, I can not print Foos" << std::endl; 
} 

int main() 
{ 
    Foo<int> b; 
    DoStuff(b); 
    DoStuff(5); 
} 

출력 :

Sorry, I can not print Foos 
5 

당신이이 같은 DoStuff, 푸 인스턴스화에 대해서만 작동 정의하려면 : 또한

template <typename T> 
void DoStuff(const T& val); 

template <typename T> 
void DoStuff(const Foo<T>& val) 
{ 
    std::cout << "Foosome argument" << std::endl; 
} 

을, 블랙리스트, 화이트리스트 또는 푸 전문 수 인스턴스화.

관련 문제