模板 typedef 不是类或命名空间名称
Posted
技术标签:
【中文标题】模板 typedef 不是类或命名空间名称【英文标题】:Template typedef is not a class or namespace name 【发布时间】:2016-08-05 10:08:27 【问题描述】:我正在编写一个模板类,它的行为应该像一个容器。内部数据是指向泛型类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:“v_p_elements”:不是类或命名空间名称
所以我评论了 begin()
方法,但在 ERROR LINE 2 它停止并出现相同的错误。
现在似乎很清楚,因为v_p_elements
是在类内部进行类型定义的,所以它可能无法导出到外部世界。但现在我要问的是整个事情是否可能,或者我只是误解了什么。
【问题讨论】:
你可能很快也会遇到这个问题:Why can templates only be implemented in the header file? 【参考方案1】:您可以添加限定的封闭类名称。
template<class T>
typename AstrContainer<T>::v_p_elements::iterator AstrContainer<T>::end()
// ~~~~~~~~~~~~~~~~~~
return _vData.end();
【讨论】:
很好,但是如果我继承class CompositeCube : public AstrContainer<Cube>
,我会进入第三类,调用CompositeCube cc; cc.begin();
,如下:LNK2019 unresolved external symbol
@PatrizioBertoni 您是否将类模板的声明和实现分为头文件和实现文件(就像您展示的那样)?请参阅 Bo Persson 的评论。
谢谢,MaHuJa 的回答顺利解决了一切!【参考方案2】:
另一种方法是使用尾随返回类型:
template<class T>
auto AstrContainer<T>::end() -> typename v_p_elements::iterator
return _vData.end();
【讨论】:
以上是关于模板 typedef 不是类或命名空间名称的主要内容,如果未能解决你的问题,请参考以下文章
尽管编辑了我的包含语句以修复,但得到“错误 C2653:'TextureManager':不是类或命名空间名称”
升级项目时发现错误:操作符“=”不明确且“ios”:不是类或命名空间名称