模板类:没有默认构造函数。

3

我知道有很多关于这个的帖子,但我仍然无法弄清楚为什么它不起作用 =/

这一行:

test = new Test2<Test>;

给我返回了这个错误:

error C2512: 'Test2<PARENT>' : no appropriate default constructor available
with
[
    PARENT=Test
]

代码:

template<class PARENT>
class Test2;

////////////////////////////

class Test
{
public:
    Test2<Test> *test;

    Test()
    {
        test = new Test2<Test>;
    }
};

/////////////////////////////

template<class PARENT>
class Test2
{
public:
    PARENT *parent;
};

////////////////////////////

有人能帮我吗?

3个回答

6
在实例化的时候(即在Test构造函数内部),编译器只有Test2<>前向声明,它还不知道有哪些构造函数可用。
要解决这个问题,可以将Test2<>的定义移动到Test之前,或者将Test构造函数的定义移动到类定义之外(并且在Test2<>定义之后)。

太棒了。谢谢。我原本以为在前向声明之后,该类的成员也会立即可用。 - CuriousGeorge

0

对我来说,你的代码(在我看来)正确地给出了错误:

invalid use of incomplete type 'struct Test2<Test>'

这是使用g++ 4.5.1编译的。在你说的那个点上:

test = new Test2<Test>;

Test2未被定义,只有前向声明。


我认为错误应该是 没有适当的默认构造函数可用,因为在创建Test2类之前,它应该需要一个Test类的构造函数。也许我错了。有任何意见吗? - Mayank

-1

代码行 test = new Test2<Test>; 正在 Test 的默认构造函数中执行。 这行代码将调用默认构造函数/无参构造函数。当该语句被调用时,Test 的构造函数仍未完成。


@Oli Charlesworth:编译器是如何知道Test的呢? - Mayank
它不需要。Test2<T>只有一个T *成员,它不需要类定义,只需要声明。 - Oliver Charlesworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接