假设您有一个继承自超类A的子类B.您需要一个可以接受A或B的函数。
template <typename T>
void someFunc(T* pObj, bool someOtherArg)
{
pObj->AnInheritMethod();
if (pObj->IsASub())
{
pObj->ANonInhertMethod();
}
}
当我编译它(Visual Studio 6)时,我得到:
error C2065: 'pObj' : undeclared identifier
我离开基地了吗?
答案 0 :(得分:2)
您不需要模板,这是一种由多态性提供的自由行为。
编辑:如果您写的内容如下:
if (pObj->IsASub())
然后你的设计可能出现了问题。该方法适用于派生链中的任何类型。
答案 1 :(得分:2)
您不需要功能模板;以下将做得很好:
void someFunc(A* pObj)
{
pObj->AnInheritMethod();
if (B* pObjAsB = dynamic_cast<B*>(pObj))
{
pObjAsB->ANonInheritMethod();
}
}
或者,如果您希望使用IsASub()
成员函数代替dynamic_cast
:
void someFunc(A* pObj)
{
pObj->AnInheritMethod();
if (pObj->IsASub())
{
B* pObjAsB = static_cast<B*>(pObj);
pObjAsB->ANonInheritMethod();
}
}
除了丢失的返回类型之外,我没有看到示例中的代码有任何明显错误;我没有安装Visual C ++ 6来检查。
答案 2 :(得分:1)
您提出的问题与您所包含的代码和错误完全无关。
为了让函数获取A
或从A
派生的类,它需要做的就是获取A
的指针或引用,例如
someFunc(A* pObj, bool someOtherArg);
或
someFunc(A& obj, bool someOtherArg);
它将通过继承而发挥作用。这就是从彼此派生类的重点。您使用模板编写它的方式,它将与任何类一起使用,该类定义您使用的三种方法,无论它是否来自A
。
现在您发布的错误与此问题无关,但很奇怪。您发布的代码没有任何问题,但Visual Studio 6是一个古老的编译器;它已有12年历史,并不完全支持现代ISO标准C ++。此错误可能是编译器中的子标准模板实现的工件。