C++ 使用std::initializer\u列表的泛型类型用法

C++ 使用std::initializer\u列表的泛型类型用法,c++,C++,我无法理解为什么g++总是抱怨iter vector.cpp:42:8:错误:“std::initializer\u list::iterator”之前需要“typename” 代码如下: template<typename T> Vector<T>& Vector<T>::operator=(std::initializer_list<T> list) { if ( list.size() > 0 ) {

我无法理解为什么g++总是抱怨iter

vector.cpp:42:8:错误:“std::initializer\u list::iterator”之前需要“typename”

代码如下:

template<typename T>
Vector<T>& Vector<T>::operator=(std::initializer_list<T> list)
{
   if ( list.size() > 0 )
   {
       clear();

       for( std::initializer_list<T>::iterator iter = list.begin();
            iter != list.end(); iter++ ) 
       {
           push_back(*iter);
       }
   }

   return *this;
}
模板
向量和向量::运算符=(标准::初始值设定项\u列表)
{
如果(list.size()>0)
{
清除();
for(std::initializer_list::iterator iter=list.begin();
iter!=list.end();iter++)
{
推回(*iter);
}
}
归还*这个;
}

您需要向编译器指出,
std::initializer\u list::iterator
是一个类型,因为它也可以是一个成员。由于编译器在此函数中不知道
T
,这两种可能性都会导致歧义。

它必须是
typename std::initializer\u list::iterator
,因为编译器无法分辨迭代器是成员还是类型。

的确,您的权利!谢谢你的回答确实正确,非常感谢!当然,考虑到
初始值设定项\u list
是C++11的一个特性,您还应该能够使用for range循环,或者至少使用
auto
声明
iter