前置声明:模板和继承

4
当我编写框架时,遇到了以下问题: 我有一个名为 class A 和一个继承自 class A 的名为 class Bclass A 有一个返回 B* 的函数。
当然,这并不困难:
#include <iostream>
using namespace std;

class B; // forward declaration

class A
{
    public:
        B* ReturnSomeData();
};

class B : public A
{
};

// Implementation:

B* A::ReturnSomeData()
{
    return new B; // doesn't matter how the function makes pointer
}

int main()
{
    A sth;

    cout << sth.ReturnSomeData(); // print adress
}

然而,我必须像这样使用模板:
#include <iostream>
using namespace std;

// This "forward declaration":

template <class Number>
class B<Number>;

// cannot be compiled:
// "7 error: 'B' is not a template"

template <class Number>
class A
{
    public:
        B<Number>* ReturnSomeData();
};

template <class Number>
class B : public A<Number>
{
};

// Implementation:

template <class Number>
B<Number>* A<Number>::ReturnSomeData()
{
    return new B<Number>;
}

int main()
{
    A<int> sth;

    cout << sth.ReturnSomeData();
}

看一下代码。你可以看到,我不知道如何处理A B*中的未知内容。是否可能编写前向声明?还是我需要其他东西?

是的,我搜索了一下,看到有很多关于模板声明的帖子,但找不到解决我的个人问题的方法。对我来说有点复杂。

谢谢您的帮助。

1个回答

9
您的前向声明不正确。应该是这样的:

template <class Number>
class B;
       ^ no argument list

谢谢 :) 在这个简单的例子中它是有效的。但我仍然想知道为什么它在我的框架中无法工作。如果我找到原因,我会写出来的。 - leuays
好的,我知道我做错了什么——编译器开始显示“_B不是模板类型_”而非“_B不是模板_”。这就是主要问题所在。因为在一个文件中,有一个class B的声明(旧文件我忘记重建以使用模板)。这就是为什么我不能声明:template <class Number> B (编译器知道“未被模板化”的B,所以它不让我进行新的声明)。因此,我认为没有参数列表的声明是错误的,但实际上是正确的。再次感谢 :). - leuays

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