4

请看破解后更新的代码;

我有以下模板类:

template<class T> class CDFAManListOps
{
    static std::list<T>::iterator CDFAManListOps::GetIterator(std::list<T>* list, int pId)
    {
    }
}

当我尝试编译它时,它说

std::list<T>::iterator' : dependent name is not a type 1> prefix with 'typename' to indicate a type.

但是,如果我像编译器要求的那样更改函数:

static typename std::list<T>::iterator CDFAManListOps::GetIterator(std::list<T>* list, int pId)

编译器(VS12)崩溃并出现以下错误:

fatal error C1001: An internal error has occurred in the compiler.

1> (compiler file 'msc1.cpp', line 1443)

1> To work around this problem, try simplifying or changing the program near the locations listed above.

知道这段代码有什么问题吗?


更新:这是我能得到的重现此崩溃的最少代码的全部内容。

#include <list>

template<class T> class CDFAManListOps
{
    static typename std::list<T>::iterator CDFAManListOps::GetIterator(std::list<T>* list, int pId)
    {
    }

    static typename std::list<T>::iterator CDFAManListOps::GetIterator(std::list<T>* list, T object)
    {

    }
};

int main()
{

}

如果我取出两个GetIterator函数中的任何一个,程序就会编译并运行良好。只有当这两个函数都存在时,编译器才会崩溃。这是否使我的代码中的问题更清楚了?

(此外,如果有人想了解其状态,我将向 Microsoft Connect 提交错误报告并在此处发布链接。)

我在此处提交了有关 Microsoft Connect 的错误报告。

更新:微软决定在可预见的将来不对这个特定的错误做任何事情。请参阅上面的 Microsoft Connect 链接。

4

2 回答 2

4

我无法使用 MSVS2012 中的给定代码重现您的问题。这编译得很好:

#include <list>
template<class T> 
class CDFAManListOps
{
public:
  static typename std::list<T>::iterator GetIterator(std::list<T>* list, size_t pId)
  {
    typename std::list<T>::iterator it = list->begin();
    for (size_t i=0; i<pId; ++i) ++it;
    return it;
  }
};

int main(void)
{
  std::list<size_t> x(5);
  CDFAManListOps<size_t>::GetIterator(&x, 2);
  return 0;
}

好的,我现在可以重现该问题。从您的类内定义中删除CDFAManListOps::将导致正确编译您的代码。

#include <list>
template<class T> class CDFAManListOps
{
    static typename std::list<T>::iterator GetIterator(std::list<T>* list, int pId) {}
    static typename std::list<T>::iterator GetIterator(std::list<T>* list, T object) {}
};
int main() {}
于 2013-07-16T19:10:43.767 回答
0

作为一种解决方法,typedef在函数声明之前尝试将迭代器类型作为类成员:

template<class T> class CDFAManListOps
{
    typedef typename std::list<T>::iterator iter_t;
    static iter_t GetIterator(std::list<T>* list, int pId)
    {
    }
};

或完全指定列表类型:

template<class T> class CDFAManListOps
{
    template <typename Allocator>
    static typename std::list<T, Allocator>::iterator GetIterator(std::list<T, Allocator>* list, int pId)
    {
    }
};
于 2013-07-16T19:06:40.457 回答