gpt4 book ai didi

c++ - 为什么只能在一种情况下推导模板参数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:52:56 24 4
gpt4 key购买 nike

为什么以下代码针对使用非常量迭代器 的行进行编译,但对于const 迭代器(使用 Visual Studio 2008)却失败?

#include <vector>

using std::vector;

int main(int argc, char* argv[])
{
vector<int> test;

test.push_back(1);
test.push_back(2);

vector<int>::const_iterator cit = test.end();
std::distance(test.begin(), cit); // error: template parameter is ambiguous

vector<int>::iterator it = test.end();
std::distance(test.begin(), it);

return 0;
}

注意:在 Visual Studio 2008 中,没有 vector 成员函数 cbegin() 来避免歧义,而是重载了 begin() 方法:

iterator begin()
{ // return iterator for beginning of mutable sequence
return (iterator(_Myfirst, this));
}

const_iterator begin() const
{ // return iterator for beginning of nonmutable sequence
return (const_iterator(_Myfirst, this));
}

最佳答案

模板distance接受一个参数,distance<T>(T first, T last) .自 test.begin()类型为 iteratorcit类型为 const_iterator , 无法推导模板参数。

您可以使用 test.cbegin()获得保证const_iterator ,或者说 static_cast<std::vector<int> const &>(test).begin() .

(这与您有 max<T>(T x, T y) 并试图说 max(1, 2U) 相同——它不会编译,因为它不明确。)

关于c++ - 为什么只能在一种情况下推导模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11825021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com