C++模板:返回list :: iterator

Pau*_*nta 3 c++ templates

如何使以下代码有效?在编译期间,我收到一个错误,告诉我该searchForResource函数没有返回类型.

template<class T>
class ResourceManager
{
  private:
    struct ResourceWrapper;
    std::list<ResourceWrapper*> resources_; // This compiles fine

    std::list<ResourceWrapper*>::iterator  // Error occurs here
        searchForResource(const std::string& file);
};
Run Code Online (Sandbox Code Playgroud)

另外,这是我如何定义searchForResource函数?

template<class t>
std::list<typename ResourceManager<T>::ResourceWrapper*>::iterator
    ResourceManager<T>::searchForResource(const std::string& file)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

cgm*_*gmb 9

std::list<ResourceWrapper*>::iterator编译器难以理解.typename在实现和声明中加上前缀,让编译器知道它是一个类型.

像这样:

typename std::list<ResourceWrapper*>::iterator searchForResource(const std::string& file);
Run Code Online (Sandbox Code Playgroud)

  • 这取决于编译器何时解析文本.如果编译器不解析任何模板文本,将其视为一个美化宏,那么知道`std :: list <ResourseWrapper*> :: iterator`是一个类型的名称就没有问题.如果编译器在读取模板时解析文本,而不仅仅是在实例化它时,它必须知道哪些符号代表类型名和模板; 否则你无法解析C++.如果名称不依赖,它可以在范围内查找; 在这种情况下,名称是依赖的,因此您必须告诉编译器它是一个类型名称. (2认同)

Kir*_*sky 5

template<class T>
class ResourceManager
{
  private:
    struct ResourceWrapper;
    std::list<ResourceWrapper*> resources_;

//      | typename lost here
//      V
    typename std::list<ResourceWrapper*>::iterator
        searchForResource(const std::string& file);
};

template<class T>
//  | typename lost here                    asterisk lost here | 
//  V                                                          V 
typename std::list<typename ResourceManager<T>::ResourceWrapper*>::iterator
    ResourceManager<T>::searchForResource(const std::string& file)
{
   return ...   
}
Run Code Online (Sandbox Code Playgroud)