0

我编写了一个模板,只有在 a重载时才具有有效用法struct,否则会出现编译器错误,classbool 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))

我在这部分迷路了,模板假定 T 的类型vector<T>由传递的第二个参数的值分配?或者它会从传递的矢量引用的类型中假设?

4

2 回答 2

2

两个参数必须匹配。模板参数推导尝试为每个模板参数找到一个类型,使函数参数类型与提供的参数的类型匹配。

有时这会变得有点棘手,而应该工作的事情却没有。例如:

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

这失败了,因为第一个参数想要推断T = int,但第二个参数想要T = unsigned int。推演失败,代码无法编译。(如果这是一个问题,那么解决方案是使除一个函数参数以外的所有参数都为非推导。)

于 2012-10-17T02:30:30.770 回答
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
}
于 2012-10-17T02:31:09.410 回答