6

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

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

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

谢谢,

螺旋状的

更新:

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

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 使用它时,出现错误。这是我的主要方法:

主文件

#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>*'

再次感谢您的快速回复。

螺旋状的

4

3 回答 3

7

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

template <class E>
typename A<E>::B * A<E>::getB() {
    return new B();
}
于 2010-04-06T19:20:45.857 回答
2

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

template <class E>
typename A<E>::B * A::getB() {
   return new B;
}
于 2010-04-06T19:21:30.573 回答
0

回复更新:

您不需要newC++ 中的所有内容,事实上,最好不要,因为那时您必须显式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();
}

如果你希望类,new那么A<C>你需要使用operator->调用方法:

A<C>::B b = a->getB();
于 2010-04-07T07:28:49.733 回答