我正在编写一个应该像容器一样的模板类。内部数据是通用类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 ++ 中的模板类很新,并且对 ERROR LINE 1
感到有点困惑错误C2653:&#39; v_p_elements&#39;:不是类或命名空间名称
所以我评论了begin()
方法,但在 ERROR LINE 2 时,它会停止并出现相同的错误。
现在似乎很清楚,因为v_p_elements
在类中是typedef,所以它可能无法导出到外部世界。但现在我要问整件事情是否可能,或者我是否只是误解了某些事情。
答案 0 :(得分:1)
您可以添加限定的封闭类名。
template<class T>
typename AstrContainer<T>::v_p_elements::iterator AstrContainer<T>::end()
// ~~~~~~~~~~~~~~~~~~
{
return _vData.end();
}
答案 1 :(得分:1)
另一种方法是使用尾随返回类型:
template<class T>
auto AstrContainer<T>::end() -> typename v_p_elements::iterator
{
return _vData.end();
}