在另一个类模板中使用不同的类模板

Use different class templates inside another class template

本文关键字:另一个      更新时间:2023-10-16

请考虑以下指针类模板:

// PointerTemplates.hpp    
template <class T, class X = ClassX<T>, class Y = ClassY<T> >
class Smart_Ptr_A
{
// [...]
};
template <class T>
class Smart_Ptr_B
{
// [...]
};
template <class T, class Count = TSCount>
class Smart_Ptr_C
{
// [...]
};

我想创建与这些指针相对应的其他智能指针,但成员指针不是"<>"中的对象,而是按原样运行。 像这样:

template<class PointedClass>
class Smart_Ptr_A_Modified
{
public:
// [...]
PointedClass& operator*() const
{ return m_pOtherClass->getPointedClass(); }
// OtherClass contains a PointedClass.
Smart_Ptr_A<OtherClass> m_pOtherClass;
};

智能指针的几乎所有方法和运算符都是相同的,因此我想使用模板来实现它们的共同点并对其进行专用化。
我该怎么做?

现在,我有如下内容:

// Common implementation
template< template<class> class PtrType, class PointedClass>
class CommonModifiedPtr
{
// implementation of things in common 
// [...]
private:
PtrType<OtherClass> m_pOtherClass;
}
// Specialization
template<class PointedClass>
class Smart_Ptr_A_Modified
: CommonModifiedPtr<Smart_Ptr_A<OtherClass>, PointedClass>
{
public:
PointedClass* releaseControl()
{ return m_pOtherClass->releaseControl(); }
};
template<class PointedClass>
class Smart_Ptr_B_Modified
: CommonModifiedPtr<Smart_Ptr_B<OtherClass>, PointedClass>
{};
template<class PointedClass>
class Smart_Ptr_C_Modified
: CommonModifiedPtr<Smart_Ptr_C<OtherClass>, PointedClass>
{};

但是对于每个专业化,我都会收到以下错误:

错误 C3200:"Smart_Ptr_A_Modified":模板参数"PtrType"的模板参数无效,需要类模板

附加信息 : 我将 MSVC++ 10.0 与 C++98 一起使用,我对模板知之甚少。

继承确实是正确的方法。 在下面的代码中:

template<class PointedClass>
class Smart_Ptr_X_Modified
: CommonModifiedPtr<Smart_Ptr_X<OtherClass>, PointedClass>
{ // ...

应替换为:

template<class PointedClass>
class Smart_Ptr_X_Modified
: CommonModifiedPtr<Smart_Ptr_X, PointedClass>
{ // ...

"X"分别替换为A,B,C。 这是因为Smart_Ptr_X<OtherClass>是特定的类,而不是类模板。


编辑:以上可能不完全是您想要的。这取决于OtherClass是什么以及您希望它如何适应您的代码。 有关更好的答案,请参阅以下内容:https://stackoverflow.com/help/minimal-reproducible-example


第二次编辑:在上面的替换之后,您遇到的问题来自可选的模板参数 -Smart_Ptr_X类需要不同的模板参数(不要介意其中一些具有默认值(,统一处理它们会有问题。

我可以建议的一个丑陋的解决方案是,出于CommonModifiedPtr的目的,您不使用Smart_Ptr_X,而是使用类似的东西:

template <class T>
class Simple_Smart_Ptr_X : Smart_Ptr_X<T> {};
相关文章: