using namespace std;
template<typename T>
int f(vector<T> &v){
return v.size();
}
template<typename T>
class B{
public:
int size(){
return v.size();
};
private:
vector<T> v;
};
int main(int argc, char** argv) {
B<string> b;
vector<string> v;
for(int i=0; i<f<string>(v)-1; i++)
std::cout << "using fn template" << endl;
for(int i=0; i<b.size()-1; i++)
std::cout << "using class B" << endl;
for(int i=0; i<v.size()-1; i++)
std::cout << "done" << endl; //Why is this printing???
return (EXIT_SUCCESS);
}
答案 0 :(得分:13)
vector
的{{1}}函数返回一个未签名的size()
类型的值。因此,如果size_t
返回0并从中减去1,那么您将得到一个非常大的数而不是-1。由于size()
为0,因此非常大的数字将大于0,因此条件i < v.size() - 1
将为真。
修改强>:
我应该通常在迭代数组或i
时添加,只要您的索引小于数组的大小或vector
而不是大小-1,就会迭代。 / p>
vector
可能就是你真正想做的事情。即使您使用 for(int i = 0; i < v.size(); ++i)
std::cout << "done" << endl;
来摆脱已签名和未签名的问题,循环也会出错,因为如果您实际拥有(int)v.size() - 1
中的元素,则会错过最后一个元素。