2016-02-26 18 views
7

Tôi đang tạo một lớp Ma trận đơn giản. Tôi cố gắng để thêm một tham số mẫu giấu tên để đảm bảo nó được sử dụng với các loại không thể thiếuC++: Cách sử dụng các tham số mẫu chưa đặt tên trong các thành viên của lớp?

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

Tôi muốn xác định các nhà xây dựng bên ngoài định nghĩa lớp

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 ++ trả về lỗi sau

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

Bạn có biết cách giải quyết vấn đề này không?

Xin cảm ơn trước.

+0

Bằng cách "xác định bên ngoài", ý của bạn là gì? Trong một tập tin cpp? – Garf365

+0

Không, trong tiêu đề, ngay sau dấu phẩy kết thúc định nghĩa lớp. –

Trả lời

5

Tên thông số mẫu là "cục bộ" cho mỗi tuyên bố mẫu. Không có gì ngăn cản bạn chỉ định tên. Mà bạn thực sự phải làm gì nếu bạn cần tham khảo tham số đó sau (chẳng hạn như sử dụng nó như một đối số trong khuôn mẫu-id của lớp).

Vì vậy, trong khi bạn có điều này trong định nghĩa lớp:

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

Bạn có thể xác định nó ở bên ngoài lớp ví dụ như thế này:

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

Chỉ cần đừng quên rằng trong các trường hợp chung, templates can only be defined in header files.

Các vấn đề liên quan