2012-10-17 80 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 
}