2017-11-17 12 views
0

私はマトリックスクラスを特徴とする私のライブラリの読みやすさを向上させようとしています。特に私は、クラス定義を見るときに、ユーザが直接的な概要を得ることを望みます。したがって、私は定義の外で実際の関数を移動しています。ただし、コピーコンストラクタの場合は失敗したようです。特に、テンプレートを正しく定義することはできません。クラス定義の外に関数を移動

最小限の例では、(クラス定義の外の機能を搭載)以下の通りです:あなたの質問を想定し

#include <vector> 

template<class X> 
class matrix 
{ 
private: 
    std::vector<X> m_data; 

public: 
    matrix(){}; 
    matrix(size_t n); 
    X& operator[](size_t i); 
    size_t size(); 

    template<\ 
    typename U,typename V=X,\ 
    typename=typename std::enable_if<std::is_convertible<X,U>::value>::type\ 
    > 
    operator matrix<U>() 
    { 
    matrix<U> out(size()); 

    for (size_t i = 0 ; i < size() ; ++i) 
     out[i] = static_cast<U>(m_data[i]); 

    return out; 
    } 

}; 

template<class X> 
matrix<X>::matrix(size_t n) 
{ 
    m_data.resize(n); 
} 

template<class X> 
X& matrix<X>::operator[](size_t i) 
{ 
    return m_data[i]; 
} 

template<class X> 
size_t matrix<X>::size() 
{ 
    return m_data.size(); 
} 

int main() 
{ 
    matrix<double> A(3); 

    matrix<int> B = A; 
} 
+0

はすべて '\\'文字とは何ですか? – Bathsheba

+2

コピーコンストラクタはどこですか?そこには変換演算子テンプレートしか表示されていません... –

+0

あなたはもちろんもちろん....! –

答えて

2

は変換演算子テンプレート(あなただけが暗黙のコピーcostructorを持っている)、に構文を指し、したがって、メンバーテンプレートは、(デフォルトなしに、クラス最初の)両方テンプレートパラメータを指定する必要が出て移動:

template<class X> 
template<typename U,typename V,typename E> 
matrix<X>::operator matrix<U>() 
{ 
    //... 
+0

ありがとう、これは私が探していたものです! –

関連する問題