2012-10-17 120 views
0

我寫了一個模板,只有當一個structclass重載了bool operator==否則編譯器錯誤會拿出一個有效的使用,模板如何呈現數據類型?

namespace atn { 
    template <typename T> 
    bool find(std::vector<T>& cont, T find) { 
     for(std::vector<T>::iterator it = cont.begin(); it != cont.end(); ++it) { 
      if((*it) == find) 
       return true; 
     } 
     return false; 
    } 
}; 

所以罰款是好的,例如:

struct sPlayer { 
    u_int idPlayer; 
    sPlayer() : idPlayer(0) {}; 
    bool operator==(const sPlayer& ref) const { 
     return ref.idPlayer == this->idPlayer; 
    }; 
}; 

int _tmain(int argc, _TCHAR* argv[]) { 
    std::vector<sPlayer>a; 
    sPlayer player; 
    player.idPlayer = 5; 
    a.push_back(player); 
    if(atn::find(a, player)){ 
     std::cout << "Found" << std::endl; 
    } 
    return 0; 
} 

事情是,如果我這樣使用它:

vector<int>hold; 
if(atn::find(hold, 4)) 

我迷失在這個部分,模板tes假設通過傳遞的第二個參數的值在vector<T>處分配的T的類型?或者它會從傳遞的向量引用的類型中假設?

回答

2

兩個參數必須匹配。模板參數推導嘗試爲每個模板參數找到一個類型,使得函數參數類型與提供的參數的類型匹配。

有時候這會有點棘手,而且應該起作用的事情不會。例如:

std::vector<int> v; 
atn::find(v, 1U); 

這將會失敗,因爲第一個參數要演繹T = int,但第二個參數要T = unsigned int。扣除失敗並且代碼不能編譯。 (如果這是一個問題,則該解決方案是讓所有而不是一個函數參數非推導。)

2

模板假定T的類型,以在矢量由第二個參數的值被分配通過呢?或者它會從傳遞的向量引用的類型中假設?

都沒有。編譯器會分別推斷每個參數的類型,然後它將驗證所有情況下的推斷類型是否相同。如果所有參數的推斷類型不同,它將無法編譯。

之一這個常見的例子是std::max(或std::min)模板:

template <typename T> 
T min(T lhs, T rhs) { 
    return (lhs < rhs? lhs : rhs); 
} 
int main() { 
    min(1,1u); // error 
}