2017-04-19 69 views
-1

這是我的頭文件:我無法理解這些代碼是如何工作的

#pragma once 

template <typename T> 
T Sub(T a, T b) 
{ 
    return a - b; 
} 

這是我的樣本參考C++源文件。

#include "NonrecursiveInorderTree.h" 
#include <iostream> 

using namespace std; 

template<typename T1, typename T2> 
void ShowData(T1 a, T2 b) 
{ 
    cout << a << ""; 
    cout << b << endl; 

} 


int main(void) 
{ 
    ShowData(1, 2); 
    ShowData(3, 2.5); 

    return 0; 
} 

我正在學習模板,我無法理解我的代碼如何處理頭文件。

我的意思是,即使頭文件有一個減法函數,爲什麼這個結果不是像-1或0.5那樣的相減?相反,我得到12和32.5? 如何將sub(a, b)寫入cout

+0

讓'ShowData'中的語句爲'cout << Sub(a,b)<< endl'。 – MNS

+2

但是你不在任何地方使用'Sub'?創建[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)時,請確保它是*完整*。另外,'NonrecursiveInorderTree.h'頭文件是什麼?你有'Sub'模板嗎? –

+1

它打印12和32.5,因爲它不打印空間這一行'cout << a <<「」'。它打印1和2,3和2.5兩個數字之間沒有空格。 – Laurence

回答

0

Sub()功能實現,但是你也沒有告訴它:

template<typename T1, typename T2> 
void ShowData(T1 a, T2 b) 
{ 
    // It's better to explicitly use std prefix 
    std::cout << Sub<int>(a, b) << std::endl; 
} 

BTW,結果將是:

-1 
1 

第二個結果是不是0.5。由於2.5將自動轉換爲int(如調用Sub()時指定),所以浮點部分將丟失。

+0

這不符合'ShowData'的模板化。 –

-2

Sub不會被調用,因爲您不要撥打Sub。電腦正在按照你所說的去做。

如果你想ShowData打印a減去b然後寫:

cout << Sub(a, b) << endl; 

代替:

cout << a << ""; 
cout << b << endl; 
+0

這不符合'ShowData'的模板化。 –

+0

@パスカル你的問題是什麼?它在第一次調用中適用於我,而不是在第二次調用中,因爲它不能推導出'T',但這不是問題所問的問題。 – immibis

+0

Sub是一個模板。你將它視爲一種功能。你應該使它成爲T1類型的模板 –

-1

替換此:

template<typename T1, typename T2> 
void ShowData(T1 a, T2 b) 
{ 
    cout << a << ""; 
    cout << b << endl; 

} 

有了這個

template<typename T1, typename T2> 
void ShowData(T1 a, T2 b) 
{ 
    cout << Sub<T1>(a,b)<<endl; 


} 

假設"NonrecursiveInorderTree.h"是頭文件。