2013-03-29 103 views
0

嗨我想为模板构建空的函数,以便稍后可以填写细节。这里是我的代码:模板类错误

namespace my { 
    template <class T> 
    class Sptr { 
    private: 
     //some kind of pointer 
      //one to current obj 
     T obj; 
     size_t reference_count; 
      //one to original obj 
    public: 
     template <typename U> Sptr(U *); 
     Sptr(const Sptr &); 
     //template <typename U> Sptr(const Sptr<U> &); 
     ~Sptr(); 
     T* operator->() {return &obj;}; 
     template <typename U> Sptr<T> &operator=(const Sptr<U> &); 
     //overload *,->,=,copy-constructor 

     // const-ness should be preserved. 
     // Test for null using safe-bool idiom 
     // Static casting, returns a smart pointer 
    }; 


    template <typename U> Sptr<U>::Sptr(U* u) { 
     //do something 
    } 

    template <typename T> Sptr<T>::Sptr(const Sptr<T> &copyObj) { 
     //do copy constructor stuff 
    } 

    template <typename T> Sptr<T>::Sptr& operator=(const Sptr<T> &T) { 
     return *this; 
    } 
} 

但是,当我编译它时出现以下错误。

Sptr.hpp:30:24: error: prototype for ‘my::Sptr<T>::Sptr(U*)’ does not match any in class ‘my::Sptr<T>’ 
Sptr.hpp:17:3: error: candidates are: my::Sptr<T>::Sptr(const my::Sptr<T>&) 
Sptr.hpp:16:25: error:     template<class T> template<class U> my::Sptr::Sptr(U*) 
Sptr.hpp:38:24: error: ‘my::Sptr<T>::Sptr’ names the constructor, not the type 

我该如何解决它们?

回答

2

您定义类模板的成员函数的方式不正确。这里是你应该如何定义构造函数模板:

template<typename T> // <== template parameter declaration for Sprt<T> 
template<typename U> // <== template parameter declaration for constructor 
Sptr<T>::Sptr(U* u) { 
    //do something 
} 

这里是你应该如何定义operator =

template <typename T> // <== template parameter declaration for Sprt<T> 
template<typename U> // <== template parameter declaration for operator 
Sptr<T>& Sptr<T>::operator=(const Sptr<U> &t) { 
    return *this; 
} 
3

应该是

template <typename T> 
    template <typename U> 
     Sptr<T>::Sptr(U* u) { 
     //do something 
    } 

类似地对于其它成员函数的模板。

+0

能不能做到为'模板特征码 ::特征码(U * U)'? – John

+0

@John:不,它不是带有两个模板参数的模板。它是类模板中的函数模板 –

1

你同时定义构造函数和operator=为模板功能。我不确定你是否真的想要这样。他们不应该只是以T为参数吗?你确定你不想要这个你的构造函数声明:

Sptr(T*); 

如果你确实想他们是函数模板,这是不正确的:

当你有一个内部函数模板功能类,你需要给的模板参数两组:

template <typename T> 
template <typename U> 
Sptr<T>::Sptr(U* u) { 
    //do something 
}