2013-03-09 2 views
1

이 코드가 컴파일되지 않는 이유를 이해해 주시겠습니까? C++ 템플릿을 이해하려고합니다.함수 템플릿

#include <iostream> 
#include <algorithm> 
#include <vector> 

template <class myT> 
void myfunction (myT i) 
{ 
    std::cout << ' ' << i; 
} 

int main() 
{ 
    double array1[] = {1.0, 4.6, 3.5, 7.8}; 

    std::vector<double> haystack(array1, array1 + 4); 

    std::sort(haystack.begin(), haystack.end()); 

    std::cout << "myvector contains:"; 
    for_each (haystack.begin(), haystack.end(), myfunction); 
    std::cout << '\n'; 
    return 0; 
} 
+0

컴파일되지 않으면 적어도 오류를 제공하십시오. – chris

+0

또한 "using namespace std;"를 포함 할 수도 있습니다. 그래서 당신은 "std ::" – jrubins

+3

@jrubins을 쓰는 것을 계속 할 필요가 없다. 그것은 일반적으로 [나쁜 연습]으로 간주된다. (http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered- a-bad-practice-in-c). – chris

답변

1

템플릿은 청사진과 같습니다. 많은 수의 myfunction이있을 수 있습니다. 각각 다른 유형이 있습니다. 당신은 하나가 사용하도록 컴파일러에 알려이 경우 인스턴스화 할 때 유형을주고 있습니다 자동으로 사용할 템플릿

for_each (haystack.begin(), haystack.end(), myfunction<double>); 
                 ^^^^^^^^ 
+0

하지만 for_each() 함수는 myfunction()에 double을 전달하고 myfunction()은 인스턴스화하지 않을 것이라고 생각합니다. –

+0

@HovnatanKarapetyan, 문제는 기능에 대한 청사진이 아니라 특정 기능을 필요로한다는 것입니다. 각 유형에는 고유 한 기능이 있으며 사용하려는 유형을 알고 있습니다. 또한 컨테이너에 저장된 유형을 항상 사용하지는 않을 수도 있습니다. doubles를 입력하고 그들 중 가장 큰 정수를 모두 출력해야한다고 가정 해보십시오. 당신은'std :: istream_iterator '을 사용하여 당신의 입력을 얻을 수 있고'std :: ostream_iterator '를 사용하여 출력 할 수 있습니다. – chris

2

당신이 함수에 myfunction를 전달하는 때문에를, 그것은 작동하지 수 myfunction<double>

myfunction(2.0)과 같이 직접 호출 할 때는 적용되지 않으므로 컴파일러는 사용자가 지정한 매개 변수를 기반으로 사용할 템플릿을 알아낼 것이기 때문에 컴파일러가이를 알 수 있습니다.