2016-02-26 18 views
7

Ben basit Matris sınıf oluşturma. Ben ayrılmaz türleriC++: Sınıf üyelerinde adlandırılmamış şablon parametreleri nasıl kullanılır?

#include <string> 
#include <vector> 
#include <boost/utility/enable_if.hpp> 
#include <boost/type_traits/is_scalar.hpp> 

template <typename T, typename = typename boost::enable_if<boost::is_scalar<T> >::type> 
class Matrix 
{ 
    public: 
     Matrix(const size_t nrow, const size_t ncol); 

    private: 
     const size_t nrow_; 
     const size_t ncol_; 
     std::vector<std::string> rownames_; 
     std::vector<std::string> colnames_; 
     std::vector<T> data_; 
}; 

ile kullanıldığından emin olmak için ismi açıklanmayan bir şablon parametre eklemek çalışıyorum ben sınıf tanımının dışında aşağıdaki hata verir ++

template <typename T,typename> 
inline Matrix<T>::Matrix(size_t nrow, size_t ncol) 
    : nrow_(nrow), 
    ncol_(ncol), 
    rownames_(nrow_), 
    colnames_(ncol_), 
    data_(nrow_*ncol) 
{}; 

g kurucusu tanımlamak istiyorum

Matrix.hh:25:50: error: invalid use of incomplete type ‘class Matrix<T>’ 
inline Matrix<T>::Matrix(size_t nrow, size_t ncol) 

Bu sorunu çözmek için nasıl biliyor musunuz?

Şimdiden teşekkürler.

+0

, ne demek? Bir cpp dosyasında mı? – Garf365

+0

Hayır, başlıkta, sınıf tanımını sona erdiren virgülden hemen sonra. –

cevap

5

Şablon parametre adları her şablon ilanına "Yerel" dir. Hiçbir şey bir isim atamanızı engeller. Hangi (örneğin sınıfın şablon id bir argüman olarak kullanan gibi) daha sonra o parametrelerden bahsetmek için gerekirse gerçekten yapmanız gerekir. sınıf tanımında bu varken

Yani,:

template <typename T, typename = typename boost::enable_if<boost::is_scalar<T> >::type> 
class Matrix 
{ 
    public: 
     Matrix(const size_t nrow, const size_t ncol); 

    private: 
     const size_t nrow_; 
     const size_t ncol_; 
     std::vector<std::string> rownames_; 
     std::vector<std::string> colnames_; 
     std::vector<T> data_; 
}; 

Derse örn dışına tanımlayabilir Böyle:

template <typename AnotherName,typename INeedTheName> 
inline Matrix<AnotherName, INeedTheName>::Matrix(size_t nrow, size_t ncol) 
    : nrow_(nrow), 
    ncol_(ncol), 
    rownames_(nrow_), 
    colnames_(ncol_), 
    data_(nrow_*ncol) 
{}; 

Sadece o templates can only be defined in header files, ortak şartlar altında unutma. "Dış tanımlamak" ile

İlgili konular