模板 typedef 不是 class 或命名空间名称

Template typedef is not a class or namespace name

我正在编写一个模板 class,它的行为应该像一个容器。内部数据是指向泛型 class T.

的智能指针向量

页眉

#include <vector>
#include <boost/shared_ptr.hpp>

namespace Foo
{
  template <class T>
  class AstrContainer
  {

  public:

      typedef boost::shared_ptr<T> p_element;
      typedef std::vector<p_element> v_p_elements;

  protected:

    v_p_elements _vData;

  public:
    AstrContainer();
    virtual ~AstrContainer();

    typename v_p_elements::iterator begin();
    typename v_p_elements::iterator end();
  };
}

来源

#include "AstrContainer.hpp"

namespace Foo
{
    template<class T>
    AstrContainer<T>::AstrContainer()
    {
    }

    template<class T>
    AstrContainer<T>::~AstrContainer()
    {
    }

    typename
    v_p_elements::iterator AstrContainer<T>::begin() // - - - ERROR LINE 1 - - -
    {
        return _vData.begin();
    }

    template<class T>
    typename v_p_elements::iterator AstrContainer<T>::end() // - - - ERROR LINE 2 - - -
    {
        return _vData.end();
    }
}

我对 C++ 中的模板 classes 非常陌生,并且在 ERROR LINE 1 上有点卡住了]

error C2653: 'v_p_elements': is not a class or namespace name

所以我评论了 begin() 方法,但是在 ERROR LINE 2 它因同样的错误而停止。

现在看来很清楚,因为 v_p_elements 是在 class 中进行类型定义的,所以它可能无法导出到外部世界。但现在我想问的是整个事情是否有可能,或者我是否只是误会了什么。

您可以添加合格的封闭 class 名称。

template<class T>
typename AstrContainer<T>::v_p_elements::iterator AstrContainer<T>::end()
//       ~~~~~~~~~~~~~~~~~~
{
    return _vData.end();
}

另一种方法是使用尾随 return 类型:

template<class T>
auto AstrContainer<T>::end() -> typename v_p_elements::iterator
{
    return _vData.end();
}