从泛型外部类返回嵌套内部类的指针 我对C++很陌生,所以请容忍我。我有一个名为a的泛型类。a有一个名为B的嵌套类。a包含一个名为getB()的方法,该方法应该返回一个新的B实例。但是,我无法编译代码。它看起来是这样的:#包括

从泛型外部类返回嵌套内部类的指针 我对C++很陌生,所以请容忍我。我有一个名为a的泛型类。a有一个名为B的嵌套类。a包含一个名为getB()的方法,该方法应该返回一个新的B实例。但是,我无法编译代码。它看起来是这样的:#包括,c++,templates,nested-class,C++,Templates,Nested Class,A.h 有人知道我做错了什么吗 谢谢 螺旋形 更新: 谢谢大家的快速回复。我仍然有一点小麻烦让这个工作。在采纳了这里列出的建议后,我有如下想法: A.h 模板 甲级{ 公众: B类{ 公众: int数据; }; B*getB(); }; 模板 typename A::B*A::getB(){ 返回新的B(); } C类{ }; 然而,当我试图从main使用它时,我得到了一个错误。以下是我的主要方法: main.cpp #include "A.h" int main(int argc, cha

A.h

有人知道我做错了什么吗

谢谢

螺旋形

更新:

谢谢大家的快速回复。我仍然有一点小麻烦让这个工作。在采纳了这里列出的建议后,我有如下想法:

A.h

模板
甲级{
公众:
B类{
公众:
int数据;
};
B*getB();
};
模板
typename A::B*A::getB(){
返回新的B();
}
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();
}
#包括“A.h”
int main(int argc,char*argv[])
{
A*A=新的A();
A::B*B=A.getB();
}
当我尝试编译此文件时,会出现以下错误:

error: expected constructor, destructor, or type conversion before '*' token
error: request for member 'getB' in 'a', which is of non-class type 'A<C>*'
错误:请求'a'中的成员'getB',该成员为非类类型'a*'
再次感谢您的快速回复


helixed

编译器不够聪明,无法在模板化“a”时判断“B”是一种类型。尝试使用typename

template <class E>
typename A<E>::B * A<E>::getB() {
    return new B();
}
模板
typename A::B*A::getB(){
返回新的B();
}

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

template <class E>
typename A<E>::B * A::getB() {
   return new B;
}
模板
typename A::B*A::getB(){
返回新的B;
}
更新的答案:

<>你不需要<代码>新< /Cord> C++中的所有东西,实际上,如果你没有,最好是这样,从那时起,你必须显式地<代码>删除>代码>分配内存或使用智能指针。 下面是您的代码修订版:

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();
}

嗯,在科莫工作。但即使这是经过编译的,它会有帮助吗?getB的定义仅在A.cpp中可用。因为它是一个模板,所以除非编译器支持“导出”,否则不能从任何其他翻译单元调用它。对编辑的响应:使用
->
通过指针访问成员。哦,天哪,我现在觉得自己真的很笨。我在Java上花了太多时间。谢谢你的帮助,史蒂夫,不用担心。顺便说一句,对于类模板,我通常只在类定义中定义函数。除非处理类之间的相互依赖关系(意味着类和函数之间需要更多的定义),否则使用现有代码而不仅仅是
class A{…B*getB(){return new B();}…}。我写这个作为一个快速的例子来说明我遇到的问题。我真正的代码有点复杂,我试图避免大量内联代码。正如Steve Jessop提到的,将其保存在.h文件中,而不是.cc文件中。这似乎解决了最初的问题。然而,正如我在上面所发布的,我仍然有一点小麻烦。谢谢你的帮助。使用“A::B*B=A->getB();”你需要取消对“A”指针的引用。我明白你的意思了。我已将定义移到A.h文件中。谢谢
template <class E>
typename A<E>::B * A<E>::getB() {
    return new B();
}
template <class E>
typename A<E>::B * A::getB() {
   return new B;
}
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();
}
A<C>::B b = a->getB();