【问题标题】:How to create an STL object of iterators of template Type?如何创建模板类型迭代器的 STL 对象?
【发布时间】:2012-05-10 23:00:32
【问题描述】:

如何创建模板类型迭代器的STL对象? 我正在尝试创建一个模板类型的迭代器的 STL 对象(比如 Vector),如下所示

vector<vector<T>::iterator> it1;

这在 g++ 和 VC++ 中都失败了。两个编译器几乎都说同样的话

g++

Main.cpp:8:49: error: type/value mismatch at argument 1 in template parameter li
st for `template<class _T1, class _T2> struct std::pair'
Main.cpp:8:49: error:   expected a type, got `std::vector<T>::iterator'

VC++

error C2923: 'std::vector' : 'std::vector<T>::iterator' is not a valid template type argument for parameter '_Ty'

如果你正在创建一个具体类型的迭代器,它可以工作

vector<vector<int>::iterator> it1;

这是一个最小的失败示例

#include<vector>
#include<iterator>
using namespace std;
template<typename T>
class Spam {
public:
    vector<vector<int>::iterator> it1; #Compiles Fine
    vector<vector<T>::iterator>   it2; #Fails
    };

注意

我从答案中了解到,如果一个类型依赖,那么需要在关键字 typename 前加上前缀。如果是这样,那么

vector< vector<T>  >  it;

也应该失败,但它没有。如果依赖名称是typedef,它似乎只会失败并需要typename 关键字

【问题讨论】:

  • 您的注释不正确。任何命名类型的从属名称都需要typename,但在vector&lt;vector&lt;T&gt; &gt; 的情况下,没有从属名称。 (vectorT 都不是)

标签: c++ visual-c++ stl iterator g++


【解决方案1】:

你需要使用typename作为:

vector<typename vector<T>::iterator>   it2; 

这是因为iterator 是一个依赖名称,因为它依赖于模板参数T

作为旁注,请注意,当向量调整自身大小时,向量的迭代器会失效。因此,此类迭代器的向量可能没有您可能想的那么有用。要使这样的向量有用,请确保该向量永远​​不会调整自身的大小,您要将其迭代器存储在这个迭代器向量中。

【讨论】:

  • 我从答案中了解到的是,如果一个类型依赖,那么需要在关键字 typename 前加上前缀。如果是这样,那么 vector > 它;也应该失败,但事实并非如此。如果依赖名称是 typedef,它似乎只会失败并需要 typename 关键字
  • @Abhijit: vector&lt; vector&lt;T&gt; &gt; 不是从属名称。从属名称是嵌套名称,形式为SomeType&lt;T&gt;::SomeName;这里SomeName 是一个从属名称。
【解决方案2】:

这已经被问过很多次了......

 vector<typename vector<T>::iterator>

问题是嵌套类型iterator 依赖于模板的参数,所以你需要告诉编译器它是一个类型,否则它会假定它是一个常规模板。

【讨论】:

  • 同意这个问题被问得太频繁了。编译器真的应该建议它(“你的意思是vector&lt;typename vector&lt;T&gt;::iterator&gt; 吗?”)。
  • @MSalters GCC 4.6 为我做这件事
【解决方案3】:

你必须添加 typename 关键字:

vector<typename vector<T>::iterator>   it2; 

This 页面对我理解最有帮助。

【讨论】:

  • 我从答案中了解到的是,如果一个类型依赖,那么需要在关键字 typename 前加上前缀。如果是这样,那么 vector > 它;也应该失败,但事实并非如此。如果依赖名称是 typedef,它似乎只会失败并需要 typename 关键字
  • @Abhijit 你已经成功了一半。它不仅需要依赖,而且还需要限定,vector&lt; vector&lt;T&gt; &gt; 不是。我再次只能推荐我发布的链接,那里解释得很好。
  • @Abhijit vector&lt; vector&lt; T &gt; &gt; 只能是一种类型,而 vector&lt; T &gt;::iterator 可能是别的东西。在后一种情况下,您需要通知编译器您需要一个类型。
猜你喜欢
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
相关资源
最近更新 更多