您好我正在尝试为模板构建空函数,以便稍后我可以填写详细信息。这是我的代码:
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> ©Obj) {
//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
我该如何解决?
答案 0 :(得分:3)
template <typename U> Sptr<U>::Sptr(U* u) {
//do something
}
应该是
template <typename T>
template <typename U>
Sptr<T>::Sptr(U* u) {
//do something
}
类似于其他成员函数模板。
答案 1 :(得分: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;
}
答案 2 :(得分:1)
您将构造函数和operator=
定义为模板函数。我不确定你真的想要那个。他们不应该仅以T
作为论据吗?你确定你不希望这个用于你的构造函数声明:
Sptr(T*);
如果你真的希望它们是功能模板,这是不正确的:
template <typename U> Sptr<U>::Sptr(U* u) {
//do something
}
如果在函数类中有函数模板,则需要提供两组模板参数:
template <typename T>
template <typename U>
Sptr<T>::Sptr(U* u) {
//do something
}