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

どうすれば解決できますか?

4

3 に答える 3

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

する必要があります

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

他のメンバー関数テンプレートについても同様です。

于 2013-03-29T22:56:19.497 に答える
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;
}
于 2013-03-29T22:57:47.313 に答える
1

コンストラクターとoperator=as テンプレート関数の両方を定義します。あなたが実際にそれを望んでいるかどうかはわかりません。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
}
于 2013-03-29T22:57:50.430 に答える