2016-02-26 7 views
7

Ich erstelle eine einfache Matrix-Klasse. Ich versuche, eine unbenannte Template-Parameter hinzuzufügen, um sicherzustellen, dass es mit integrierten TypenC++: Wie unbenannte Template-Parameter in Klassenmitgliedern zu verwenden?

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

verwendet wird, würde Ich mag den Konstruktor außerhalb der Klassendefinition

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 definieren ++ den folgenden Fehler zurückgibt

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

Wissen Sie, wie Sie dieses Problem lösen können?

Vielen Dank im Voraus.

+0

Mit "definieren außerhalb", was meinst du? In einer cpp-Datei? – Garf365

+0

Nein, in der Kopfzeile, direkt nach dem Komma, das die Klassendefinition beendet. –

Antwort

5

Vorlagenparameternamen sind für jede Vorlagedeklaration "lokal". Nichts hindert Sie daran, einen Namen zu vergeben. Was Sie tatsächlich tun müssen, wenn Sie später auf diesen Parameter verweisen müssen (z. B. als Argument in der Template-ID der Klasse).

So, während Sie dies in der Klassendefinition haben:

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

Sie können es außerhalb der Klasse definieren z.B. dies wie:

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

nur nicht vergessen, dass unter gewöhnlichen Umständen, templates can only be defined in header files.

Verwandte Themen