【问题标题】: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::”,但警告仍然存在。它与类内部的结构有关吗?有人可以帮帮我吗?

【问题讨论】:

    标签: c++ class pointers struct


    【解决方案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 不需要范围前缀,它不再是依赖名称。跨度>
        猜你喜欢
        • 2022-06-15
        • 2015-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        • 1970-01-01
        • 2014-09-09
        相关资源
        最近更新 更多