2016-02-26 15 views
7

Sto creando una semplice classe Matrix. Sto cercando di aggiungere un parametro di modello senza nome per assicurarsi che sia utilizzato con tipi integraliC++: come utilizzare i parametri del modello senza nome nei membri della classe?

#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_; 
}; 

vorrei definire il costruttore di fuori della definizione della classe

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 ++ restituisce il seguente errore

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

Sai come risolvere questo problema?

Grazie in anticipo.

+0

Per "definire fuori", cosa intendi? In un file cpp? – Garf365

+0

No, nell'intestazione, subito dopo la virgola che termina la definizione della classe. –

risposta

5

I nomi dei parametri del modello sono "locali" per ogni dichiarazione modello. Niente ti impedisce di assegnare un nome. Che in effetti devi fare se hai bisogno di riferirti a quel parametro più tardi (come usarlo come argomento nell'ID template della classe).

Così, mentre si dispone di questo nella definizione della classe:

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_; 
}; 

si può definire di fuori della classe per esempio in questo modo:

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) 
{}; 

Basta non dimenticare che, in circostanze comuni, templates can only be defined in header files.

Problemi correlati