具有特定模板类的模板特化

时间:2013-12-23 21:11:09

标签: c++ c++11

给出以下简单的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

也许这不是正确的方法,或者可能不可能?

1 个答案:

答案 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;
        }
};