【发布时间】:2014-08-25 20:30:17
【问题描述】:
我目前遇到了模板化方法的问题。我有这个实现模板方法的公共类:
namespace Private { class InternalClass; }
namespace Public
{
class PublicClass
{
public:
PublicClass();
virtual ~PublicClass();
template<class T>
bool Add(bool primary);
private:
Private::InternalClass* _pInternal;
};
template<class T>
bool PublicClass::Add(bool primary) { return _pInternal->Add<T>(primary); }
}
内部类是这样实现的:
namespace Private
{
class InternalClass
{
public:
InternalClass();
virtual ~InternalClass();
template <class T>
bool Add(bool primary);
};
template<class T>
bool InternalClass::Add(bool primary) { return false; }
}
由于提供的源无法使用此内部类标头,因此我必须在 PublicClass 标头中对其进行类转发,并将包含添加到 PublicClass.cpp 文件中的 PrivateClass.h 中。
1) 知道为什么我会收到以下错误:
错误:成员访问不完整类型“Private::InternalClass”/注意:转发>“Private::InternalClass”声明
2) 隐藏我的 PublicClass::Add() 实现的最佳方法是什么?
更新
如 Cornstalks 所述,错误 1) 的原因是 this。
对于 2),如何在 PublicClass 头文件中不包含 PrivateClass.h 的情况下隐藏我的实现?
【问题讨论】:
-
您知道您的模板将专门用于哪些类型?
-
是的,我有一堆从 ITypeClass 派生的类,即 AClass、BClass、CClass... 我正在调用 Add
(true) 或 Add (false)。我不知道有多少派生类。 -
可以在
Private定义下定义函数。 -
您可以转发声明事物,但您不能使用转发声明类型的对象(也就是说,您不能取消引用它们或调用它们的成员函数)。编译器告诉你:你正在访问一个不完整类型的成员(你不能在
_pInternal上调用Add,因为_pInternal的“真实”类型是未知的,所以编译器不知道甚至知道_pInternal有一个Add方法,也不知道怎么调用这样的成员)。 -
@Manu343726:OP 无法使用模板推导,因为函数参数只是
bool,而不是T。模板参数必须指定。