2013-03-09 189 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 2013-03-09 03:17:33

+0

另外,您可能只想包含「using namespace std;」所以你不必繼續寫「std ::」 – jrubins 2013-03-09 03:19:09

+3

@jrubins,這通常被認爲是[壞習慣](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-考慮 - 一個壞實踐,在-C)。 – chris 2013-03-09 03:20:33

回答

1

模板就像一個藍圖。可能有很多myfunction,每個都採取不同的類型。你當你實例化它在這種情況下,告訴編譯器使用哪一個給類型:

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

,但我認爲for_each()函數將傳遞給myfunction()兩倍,這種方式myfunction()將實例化,不是嗎? – 2013-03-09 08:28:21

+0

@HovnatanKarapetyan,事情是,它需要一個特定的功能,而不是功能的藍圖。每種類型都有自己的功能,並且您知道您希望使用哪種類型。另外,您可能並不總是希望使用存儲在容器中的類型。假設你必須輸入雙打,並打印出最大的整數。你可以使用'std :: istream_iterator '得到你的輸入,然後複製到'std :: ostream_iterator '輸出。 – chris 2013-03-09 14:02:09

2

因爲你傳遞myfunction的功能,它不能工作了,自動使用哪個模板,所以你必須告訴它myfunction<double>

這不適用於直接調用它,如myfunction(2.0),因爲作爲一個方便,編譯器會根據您給它的參數找出使用哪個模板。