2015-06-12 171 views
0

這是我的代碼:模板專業化功能的C++

#include <iostream> 
using namespace std; 

template< typename T > 
T silnia(T w) { 
    cout << "not special" << endl; 
} 
template<> 
int silnia<int>(int x) { 
    cout << "special" << endl; 
} 

int main() { 

cout << silnia<double>(5) << endl; 
cout << silnia<int>(5) << endl; 

return 0; 
} 

這是輸出:

not special 
nan 
special 
4712544 

有人可以幫助我瞭解那裏有兩個額外的線路是從哪裏來的?

回答

5

你很可能得到一個編譯器警告(至少)告訴你,你的模板Tint分別爲返回,但你沒有提供返回值,這是未定義的行爲。你應該返回函數聲明的類型。

template< typename T > 
T silnia(T w) { 
    cout << "not special" << endl; 
    return w; 
} 

template<> 
int silnia<int>(int x) { 
    cout << "special" << endl; 
    return x 
} 

爲什麼重要?因爲您正在使用std::cout來嘗試輸出這些函數調用的返回值。

cout << silnia<double>(5) << endl; 
cout << silnia<int>(5) << endl; 
4

這兩個函數模板都有返回類型,但實現不返回任何內容。您有未定義的行爲,因爲您正在嘗試使用返回值。這與模板無關。

這是你的代碼的固定版本:

#include <iostream> 
using std::cout; 
using std::endl; 

template< typename T > 
T silnia(T w) { 
    cout << "not special" << endl; 
    return w; 
} 
template<> 
int silnia<int>(int x) { 
    cout << "special" << endl; 
    return x; 
} 

int main() { 
    cout << silnia<double>(5) << endl; 
    cout << silnia<int>(5) << endl; 
} 

輸出

not special 
5 
special 
5