返回类中的结构指针

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&lt;T&gt;::,这样每次提及myStruct 时都看起来像typename myClass&lt;T&gt;::myStructtypename 需要告诉编译器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&lt;T&gt;::为前缀,但也无妨。

【讨论】:

当编译器解析参数列表时,我们已经在 myClass&lt;T&gt; 类的范围内,所以 myStruct 不需要范围前缀,它不再是依赖名称。跨度>

以上是关于返回类中的结构指针的主要内容,如果未能解决你的问题,请参考以下文章

c ++如何获取指向另一个类中的当前对象的指针?

InternetCrackUrlW 不填充结构化类中指针后面的字符串值

C++学习 之 类中的特殊函数和this指针

在结构或类中使用智能指针

无法访问返回的结构中的指针值 [C]

C++ 结构体与类指针