模板 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();
}
我正在编写一个模板 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();
}