提前声明模板指针

6

我真的需要三个语句吗?就像这样

class A;
template<class _T> class B;
typedef B<A> C;

要前置声明一个模板类型为C的指针,可以这样写:

C* c = 0;

我希望能在前置声明中隐藏类AB,这是否可能?需要注意的是,请保留HTML标记。


而 litb 的两行方法略微不太直接。 - rlbond
@rlbond,已移至答案并删除了两行可怕的代码。 - Johannes Schaub - litb
3个回答

8
虽然不完全相同,您可以改用以下方法:
class C;
C* c = 0;

然后,在实现文件中,包含"A"和"B"的头文件后,像这样定义"C":

class C : public B<A> {};

如果你只需要使用B<A>的默认构造函数,那么使用继承而不是typedef应该是可行的。


编辑:在实现文件中,您不需要提前声明“A”和“B”。应该包含头文件。 - Ropez

3
是的,你需要这三行代码。请注意,这三行代码都有不同的作用。第一行声明了一个类。第二行声明了一个模板,第三行声明了一个typedef名称。在声明typedef名称时,你可以使用精细的类型说明符,如“class A”来命名类而不必将其名称放在作用域中(包括一些令人讨厌的陷阱)-但是你不能进一步将模板声明与typedef声明折叠在一起。
我不会担心这三行代码。如果需要,我只会写出它们 :)

我本希望,由于我只是在使用它作为一个私有指针,所以会有一种好的方式只保留必要的空间,而不必透露底层细节。 - Jonas Byström
你的意思是什么?你能否在问题中编写代码,展示你希望它看起来的样子以及现在的样子?我认为这样我们可以更好地理解它。 - Johannes Schaub - litb

1

我不是很明白你的问题,但是像这样的代码:

template<class _T> class B;

是非法的。C++将下划线和大写字母开头的名称保留给编译器和库实现 - 您不允许在自己的代码中使用它们。


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