我正在移植一些代码以在某些地方使用智能指针,我遇到了一个专业化的问题。在具体类型上专门化一个模板函数非常简单,但是如果我想在另一个模板化的类(在我的例子中,std :: auto_ptr)上专门化一个特定的方法呢?我似乎找不到合适的魔术词来让我的编译器不哭。
以下是代码示例:
#include <memory> // std::auto_ptr
#include <iostream> // std::cout
class iSomeInterface
{
public:
virtual void DoSomething() = 0;
};
class tSomeImpl : public iSomeInterface
{
public:
virtual void DoSomething() { std::cout << "Hello from tSomeImpl"; }
};
template <typename T>
class tSomeContainer
{
public:
tSomeContainer(T& t) : _ptr(t){}
iSomeInterface* getInterfacePtr();
private:
T _ptr;
// usage guidelines
tSomeContainer();
};
template <typename T>
iSomeInterface* tSomeContainer<T>::getInterfacePtr()
{
return _ptr;
}
void testRegularPointer()
{
tSomeImpl* x = new tSomeImpl();
tSomeContainer<tSomeImpl*> xx(x);
xx.getInterfacePtr()->DoSomething();
delete x;
}
#if 1
// specialize for auto_ptr
template <typename T>
iSomeInterface* tSomeContainer< std::auto_ptr<T> >::getInterfacePtr()
{
return _ptr.get();
}
void testAutoPtr()
{
std::auto_ptr<tSomeImpl> y(new tSomeImpl);
tSomeContainer< std::auto_ptr<tSomeImpl> > yy(y);
yy.getInterfacePtr()->DoSomething();
}
#else
void testAutoPtr()
{
}
#endif
int main()
{
testRegularPointer();
testAutoPtr();
return 0;
}
我试图在类型为std :: auto_ptr时覆盖tSomeContainer :: getInterfacePtr()方法,但我无法让它继续下去
答案 0 :(得分:1)
确实
template <template<typename> class PtrCtr, typename Ptr>
class tSomeContainer<PtrCtr<Ptr> >
{...};
为你工作?
如果它也是针对非模板类定义的,我似乎记得遇到上述问题。 YMMV
答案 1 :(得分:1)
您不能部分专门化类模板的单个成员。 (您可以部分地专门化整个类模板,除了那个成员之外具有相同的定义,但这通常不好玩。)
相反,您可以使用重载的函数模板:
namespace ntSomeContainerImpl {
template <typename T>
T* getInterfacePtr(T* ptr) { return ptr; }
template <typename T>
T* getInterfacePtr(const std::auto_ptr<T>& ptr) { return ptr.get(); }
}
template <typename T>
iSomeInterface* tSomeContainer<T>::getInterfacePtr()
{ return ntSomeContainerImpl::getInterfacePtr( _ptr ); }