给出以下简单的C ++类:
using namespace std;
template<class T1>
class ValueWrapper {
private:
T1 value_;
public:
ValueWrapper() {}
ValueWrapper(const T1& value) {
value_ = value;
}
ValueWrapper(const ValueWrapper<T1> &wrapper) {
value_ = wrapper.value_;
}
ValueWrapper& Set(const T1& value) {
value_ = value;
return *this;
}
T1 Get() const {
return value_;
}
};
我试图为该类创建一个简单的shared_ptr
包装器(如果需要,最终允许开发人员使用没有解除引用操作符的类)。虽然我已经看到了一些包装shared_ptr
的例子,但是我找不到任何对模板化类使用专门化的例子。
使用上面的课程,我创建了一个ValueShared
类,派生自shared_ptr
:
template<class T1>
class ValueShared : public shared_ptr<T1> {
public:
ValueShared& operator =(const T1& rhs) {
// nothing to do in base
return *this;
}
};
然后,我创建了一个自定义make_shared_value
函数:
//
// TEMPLATE FUNCTION make_shared
template<class T1, class... Types> inline
ValueShared<T1> make_shared_value(Types&&... Arguments)
{ // make a shared_ptr
_Ref_count_obj<T1> *_Rx = new _Ref_count_obj<T1>(_STD forward<Types>(Arguments)...);
ValueShared<T1> _Ret;
_Ret._Resetp0(_Rx->_Getptr(), _Rx);
return (_Ret);
}
但是,这是问题代码:
template<class T1, class ValueWrapper<T1>>
class ValueShared<ValueWrapper<T1>> : public shared_ptr<ValueWrapper<T1>>{
public:
ValueShared& operator =(const ValueWrapper<T1>& rhs) {
auto self = this->get();
self.Set(rhs->Get());
return *this;
}
};
我想在这里提供专门针对ValueWrapper类的equals operator
的特化(以便它从右侧值获取/设置值)。
我尝试过一些事情,但目前的错误是:
error C2943: 'ValueWrapper<T1>' : template-class-id redefined
as a type argument of a template
也许这不是正确的方法,或者可能不可能?
答案 0 :(得分:2)
以下应删除您的错误:
template<class T1>
class ValueShared<ValueWrapper<T1>> : public shared_ptr<ValueWrapper<T1>> {
public:
ValueShared& operator =(const ValueWrapper<T1>& rhs)
{
auto self = this->get();
self->Set(rhs.Get());
return *this;
}
};