【问题标题】:Return pointer to nested inner class from generic outer class从通用外部类返回指向嵌套内部类的指针
【发布时间】:2011-02-04 23:09:14
【问题描述】:

我是 C++ 新手,请耐心等待。我有一个名为 A 的泛型类。A 有一个名为 B 的嵌套类。A 包含一个名为 getB() 的方法,它应该返回 B 的一个新实例。但是,我无法编译我的代码。这是它的样子:#include

啊.h

template <class E>
class A {

public:
    class B {
    public:
        int data;
    };

    B * getB(); 
};

A.cpp

#include "A.h"

template <class E>
A<E>::B * A::getB() {
    return new B();
}

当我尝试编译它时,我收到以下错误:

error: expected constructor, destructor, or type conversion before '*' token

有人知道我做错了什么吗?

谢谢,

螺旋形

更新:

感谢大家的快速回复。我仍然很难让这个工作。采纳这里列出的建议后,我有这样的事情:

啊.h

template <class E>
class A {

public:
    class B {
    public:
        int data;
    };

    B * getB(); 
};

template <class E>
typename A<E>::B * A<E>::getB() {
    return new B();
}

class C {

};

但是,当我尝试从 main 中使用它时,我得到了一个错误。这是我的主要方法:

main.cpp

#include "A.h"

int main(int argc, char *argv[])
{
    A<C> *a = new A<C>();
    A<C>::B *b = a.getB();
}

当我尝试编译它时,我收到以下错误:

error: request for member 'getB' in 'a', which is of non-class type 'A<C>*'

再次感谢您的快速回复。

螺旋形

【问题讨论】:

  • 嗯,在 Comeau 工作。但即使这个编译,它会有帮助吗? getB 的定义仅在 A.cpp 中可用。由于它是一个模板,因此除非您的编译器支持“导出”,否则无法从任何其他翻译单元调用它。
  • 响应编辑:使用-&gt;通过指针访问成员。
  • 哦,呃,我现在觉得自己很愚蠢。我在 Java 上花了太多时间。感谢史蒂夫的帮助。
  • 不用担心。顺便说一句,对于类模板,我通常只在类定义中定义函数。除非您正在处理类之间的相互依赖关系(这意味着在类和函数之间需要有更多定义),否则使用您拥有的代码而不仅仅是 class A { ... B* getB() { return new B(); } ... }; 没有任何好处。
  • 我写这个作为一个简单的例子来说明我遇到的问题。我真正的代码有点复杂,我试图避免大量的内联代码。

标签: c++ templates nested-class


【解决方案1】:

当“A”被模板化时,编译器不够聪明,无法确定“B”是一种类型。尝试使用类型名。

template <class E>
typename A<E>::B * A<E>::getB() {
    return new B();
}

【讨论】:

  • 正如史蒂夫·杰索普所说,将其保存在 .h 文件中,而不是 .cc 文件中。
  • 这似乎解决了原来的问题。但是,正如我在上面发布的那样,我仍然遇到了一些麻烦。感谢您的帮助。
  • 使用:“A::B *b = a->getB();”您需要取消引用“a”指针。
【解决方案2】:

您需要在定义中使用typename 来提示编译器 B 是一种类型。

template <class E>
typename A<E>::B * A::getB() {
   return new B;
}

【讨论】:

  • 我明白你的意思。我已将定义移到 A.h 文件中。谢谢。
【解决方案3】:

更新答案:

您不需要new C++ 中的所有内容,事实上,最好不要这样做,因为那时您必须显式地delete 分配的内存或使用智能指针。

所以,这里是你的代码修改:

template <class E>
class A {

public:
    class B {
    public:
        int data;
    };

    B getB(); // Object, not pointer
};

template <class E>
typename A<E>::B A<E>::getB() {
    return B();
}

#include "A.h"

int main(int argc, char *argv[])
{
    A<C> a = A<C>();
    A<C>::B b = a.getB();
}

如果你想newA&lt;C&gt;类,那么你需要使用operator-&gt;来调用方法:

A<C>::B b = a->getB();

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2022-01-03
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多