返回类中的结构指针
Posted
技术标签:
【中文标题】返回类中的结构指针【英文标题】:Return a struct pointer within a class 【发布时间】:2021-09-24 06:56:11 【问题描述】:所以我写了一个类,其中一个函数返回一个结构,函数和结构都包含在类的私有部分中。是这样的:
template <typename T>
class myClass
private:
struct myStruct
...
T item;
...
;
myStruct* func(myStruct*, myStruct*);
public:
....
;
template <typename T>
inline myClass<T>::myStruct* func(myStruct* a, myStruct* b)
...
;
但是,当我尝试测试运行代码时,它会警告我:
C2061 syntax error: identifier 'myStruct'
C2143 syntax error: missing ';' before ''
C2447 '': missing function header (old-style formal list?)
我已尝试将该功能移至公共区域,但没有帮助。我还尝试在参数中的每个“myStruct”之前添加“myClass::”,但警告仍然存在。它与类内部的结构有关吗?有人可以帮帮我吗?
【问题讨论】:
【参考方案1】:您有两个问题。一个被Where and why do I have to put the “template” and “typename” keywords?(和the answer from 463035818_is_not_a_number)覆盖
另一个是与
template <typename T>
inline myClass<T>::myStruct* func(myStruct* a, myStruct* b)
...
;
您将 func
声明并定义为 非 成员函数。这是一个全局函数。
定义成员函数时需要在类名前加上前缀:
template <typename T>
inline typename myClass<T>::myStruct* myClass<T>::func(myStruct* a, myStruct* b)
// ^^^^^^^^^^^^
// Class name prefix added here
...
;
【讨论】:
【参考方案2】:您需要限定类的名称,并且由于返回类型是依赖名称,因此它需要 typename
(但您不需要 inline
,类模板的方法是隐式内联的):
template <typename T>
typename myClass<T>::myStruct* myClass<T>::func(myStruct* a, myStruct* b)
;
结构是一个类。 struct
只是声明类的替代关键字。唯一的区别是默认访问。此外,在私有部分声明结构并不像您期望的那样私有。当有一个返回 myStruct
的公共方法时,即使类型是在私有部分中定义的,也可以从外部 decltype(x.public_method())
获取类型(实际上,当有一个公共方法采用类型参数时,可能类似myStruct
)。
【讨论】:
【参考方案3】:您需要在函数定义中为myStruct
的每个实例添加前缀typename myClass<T>::
,这样每次提及myStruct
时都看起来像typename myClass<T>::myStruct
。 typename
需要告诉编译器myStruct
是一个类型而不是一个类成员。
template <typename T>
inline typename myClass<T>::myStruct* myClass<T>::func(typename myClass<T>::myStruct* a, typename myClass<T>::myStruct* b)
...
;
编辑:正如@Some程序员老兄所提到的,func实际上必须是myClass的成员。另外,参数不需要以typename myClass<T>::
为前缀,但也无妨。
【讨论】:
当编译器解析参数列表时,我们已经在myClass<T>
类的范围内,所以 myStruct
不需要范围前缀,它不再是依赖名称。跨度>
以上是关于返回类中的结构指针的主要内容,如果未能解决你的问题,请参考以下文章