C++ 类型和从属名称
我可以手动创建一个C++ 类型和从属名称,c++,templates,types,C++,Templates,Types,我可以手动创建一个std::vector::iterator对象,如: std::vector<int>::iterator i; std::vector::iterator i; 所以这里std::vector::iterator是一种类型。但当我写函数时: template <class T> std::vector<T>::iterator foo(std::vector<int>::iterator i) { return i;
std::vector::iterator
对象,如:
std::vector<int>::iterator i;
std::vector::iterator i;
所以这里std::vector::iterator
是一种类型。但当我写函数时:
template <class T>
std::vector<T>::iterator foo(std::vector<int>::iterator i)
{
return i;
}
模板
std::vector::iterator foo(std::vector::iterator i)
{
返回i;
}
编译器将显示一条警告:
std::vector<T>::iterator' : is a dependent name not a type
std::vector::iterator':是依赖名称而不是类型
而且代码不会编译。但如果我主要是这样调用函数:
int main()
{
vector<int> v;
foo(v.begin());
}
intmain()
{
向量v;
foo(v.begin());
}
应解析参数
T
。那么为什么编译器会显示错误?您必须在它前面加上Typename
std::vector::iterator
依赖于模板参数,即T
。因此,您应该在其前面加上typename:
尝试使用:
typename std::vector<T>::iterator
typename std::vector::iterator
您可以参考以下内容:以下链接提供了解决方案和答案
简而言之,“std::vector::iterator”是一个依赖名称,而不是类型名。因此,您不能直接将其用作类型名。您必须指定“typename std::vector::iterator”。提供的答案都不能真正解释为什么在这种情况下需要typename。在处理以下代码时,我遇到了同样的问题:
template<typename C>
vector<typename C::iterator> find_all(C& c, C::value_type v) {
vector<typename C::iterator> res;
for (auto p = c.begin(); p != c.end(); ++p) {
if (*p == v)
res.push_back(p);
}
return res;
}
模板
向量查找全部(C&C,C::值类型v){
向量res;
对于(自动p=c.begin();p!=c.end();++p){
如果(*p==v)
res.push_back(p);
}
返回res;
}
当我试图编译它时,我得到消息“在依赖类型名“C::value_type”之前缺少“typename”。如果我将签名更改为以下内容,则为来源:
vector<typename C::iterator> find_all(C& c, typename C::value_type v) {
vector find_all(C&C,类型名C::value_类型v){
如果编译器能算出C&C,为什么不能算出C::value\u类型