2016-02-26 7 views
7

मैं एक साधारण मैट्रिक्स कक्षा बना रहा हूं। मुझे यकीन है कि यह अभिन्न प्रकारसी ++: वर्ग के सदस्यों में अज्ञात टेम्पलेट पैरामीटर का उपयोग कैसे करें?

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

साथ प्रयोग किया जाता है बनाने के लिए एक अनाम टेम्पलेट पैरामीटर जोड़ने के लिए कोशिश कर रहा हूँ मैं कक्षा परिभाषा के बाहर निर्माता को परिभाषित करने के

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

जी ++ निम्नलिखित त्रुटि देता है चाहते हैं

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

क्या आप जानते हैं कि इस समस्या को कैसे हल किया जाए?

अग्रिम धन्यवाद।

+0

"बाहर परिभाषित करें" से, आपका क्या मतलब है? एक सीपीपी फ़ाइल में? – Garf365

+0

नहीं, शीर्षलेख में, कक्षा परिभाषा को समाप्त करने के बाद ही। –

उत्तर

5

टेम्पलेट पैरामीटर नाम प्रत्येक टेम्पलेट घोषणा के लिए "स्थानीय" हैं। कुछ भी आपको नाम देने से रोकता है। यदि आपको बाद में उस पैरामीटर को संदर्भित करने की आवश्यकता है (जैसे कक्षा के टेम्पलेट-आईडी में तर्क के रूप में इसका उपयोग करना) तो आपको वास्तव में क्या करना होगा।

तो, आप वर्ग परिभाषा में इस है, जबकि:

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

आप इसे वर्ग जैसे बाहर परिभाषित कर सकते हैं इस तरह:

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

बस आम परिस्थितियों में कि, templates can only be defined in header files मत भूलना।

संबंधित मुद्दे