c++ 使用友好类的类型作为模板参数声明 stl 向量
Posted
技术标签:
【中文标题】c++ 使用友好类的类型作为模板参数声明 stl 向量【英文标题】:c++ declaring stl vector using type of befriending class as template argument 【发布时间】:2012-10-15 02:02:35 【问题描述】:我有以下代码:
template <typename T>
class A
friend class B;
struct model_struct
[...]
template <typename T>
class B
func
typename vector<A<T>::model_struct > myVec;
向量声明给了我以下编译错误:
错误:“模板类 std::vector”的模板参数列表中参数 1 的类型/值不匹配
错误:期望一个类型,得到'ObjectExtraction::model_struct'
有什么想法吗?
【问题讨论】:
func
应该是什么?
你试过把 typename 放在A<T>::model_struct
之前吗?
【参考方案1】:
似乎缺少三件事:
类定义末尾的分号 朋友声明中的模板参数vector
声明中的 typename
说明符
后者是导致错误的问题。
我不确定B
定义中的func ...
是做什么的;您可能需要考虑将其删除。
最后,您需要B
模板的前向声明,因此您可以将它实际用于A
中的朋友声明。
以下是更正代码的尝试:
template <typename T>
class B; // Forward-declaration
template <typename T>
class A
friend class B<T>; // template argument added
struct model_struct
/*...*/
; // added semicolon
; // semicolon added
template <typename T>
class B
/* Removed 'func'. */
typename vector<typename A<T>::model_struct > myVec; // 'typename' added
;
【讨论】:
所以将类型名放入向量声明中修复了它。我还需要在向量之前输入类型名吗? @Mustafa 不,你可以删除那个。 非常感谢,我确实需要前向声明来修复出现的另一个错误。【参考方案2】:你应该这样修改:
template <typename T>
class A
friend class B;
struct model_struct
[...]
template <typename T>
class B
func
vector<typename A<T>::model_struct > myVec;
【讨论】:
由于friend
声明中缺少模板参数和缺少分号(除了问题的cmets 中提到的func
问题),这将无法编译。以上是关于c++ 使用友好类的类型作为模板参数声明 stl 向量的主要内容,如果未能解决你的问题,请参考以下文章
C++ 标准模板库STL 队列 queue 使用方法与应用介绍
C++ STL学习 —— 模板泛型算法函数对象lambda 表达式(参数捕获)函数适配器