2012-08-29 40 views
0

可能重複:
Template func and non template func call order使用模板和非模板意外輸出功能

爲什麼這個代碼代碼打印

::foo(int) 
::foo<T>(T) 

template <typename T> 
void foo(T) 
{ 
    std::cout << "::foo<T>(T) \n"; 
} 

template <typename T> 
void bar(T baz) 
{ 
    foo(baz); 
} 

void foo(int) 
{ 
    std::cout << "::foo(int) \n"; 
} 

int main() 
{ 
    foo(0); 
    bar(0); 
} 

而這

void foo(int) 
{ 
    std::cout << "::foo(int) \n"; 
} 

template <typename T> 
void foo(T) 
{ 
    std::cout << "::foo<T>(T) \n"; 
} 

template <typename T> 
void bar(T baz) 
{ 
    foo(baz); 
} 

int main() 
{ 
    foo(0); 
    bar(0); 
} 

打印

::foo(int) 
::foo(int) 

預期。

+1

dup http://stackoverflow.com/questions/12174493/template-func-and-non-template-func-call-order – ForEveR

+0

雖然我不能考慮它是一個值得在你的問題的背景下閱讀的答案:http://www.gotw.ca/publications/mill17.htm。 – Tomek

回答

4

原因是因爲模板函數只考慮在定義點可見的函數,而不是在實例化點可見的函數。如果它根據實例化可見性選擇函數,那麼您最有可能違反了左側和右側的一個定義規則。有一個標準的參考在我的答案相關的問題Adding specializations of template functions later

+1

我認爲(不是100%),即使原型是半隨機順序,如果你要把你的函數原型放在任何可以解決這個問題的定義之前。只要他們全都領先於定義,我認爲這也行得通。 –