2012-04-21 22 views
16

Tôi nhận thấy các câu hỏi tương tự đã được hỏi trước đây, nhưng tôi đã đọc một vài câu hỏi và vẫn không thấy tôi đang đi sai. Khi tôi chỉ đơn giản là viết lớp của tôi mà không tách nguyên mẫu khỏi định nghĩa, mọi thứ đều hoạt động tốt. Vấn đề xảy ra khi tôi tách các nguyên mẫu và định nghĩa như hình dưới đây:"được sử dụng không có thông số mẫu"

template<class T> class VisitedSet { 
public: 
    VisitedSet(); 
    int getSize(); 
    void addSolution(const T& soln); 
    void evaluate(); 
private: 
    vector<T> vec; 
    int iteration; 
}; 

Và như một ví dụ về một định nghĩa mà mang lại cho tôi lỗi này:

int VisitedSet::getSize() { 
    return vec.size(); 

Tôi chưa bao giờ làm một lớp templated trước , vì vậy xin vui lòng tha thứ cho tôi nếu vấn đề ở đây là tầm thường.

+0

Lưu ý: Trong hầu hết các trường hợp, bạn muốn định nghĩa các chức năng thành viên mẫu có thể truy cập được trong tiêu đề. Nếu các định nghĩa nằm trong tiêu đề, hãy nhớ đánh dấu chúng là 'inline' (hoặc định nghĩa chúng bên trong định nghĩa lớp mẫu), nếu chúng không, suy nghĩ hai lần và chắc chắn rằng bạn không cần định nghĩa trong phần đầu (bạn làm không cần định nghĩa trong tiêu đề nếu bạn khởi tạo rõ ràng trong đơn vị dịch có chứa định nghĩa cho * tất cả * loại mà bạn muốn sử dụng mẫu). Tôi sợ rằng bạn sẽ nhận được một chút bởi điều này khá sớm ... –

Trả lời

28

VisitedSet là một mẫu, không phải là một lớp, vì vậy bạn không thể sử dụng VisitedSet trong một tên specifier lồng nhau như vậy là VisitedSet::getSize(). Cũng như bạn quy định việc kê khai của class VisitedSet<T> cho tất cả class T, bạn phải chỉ định nghĩa của VisitedSet<T>::getSize() cho tất cả class T:

template<class T> 
int VisitedSet<T>::getSize() { 
//   ^^^ 
    return vec.size(); 
} 

Tên của một mẫu có thể, tuy nhiên, được sử dụng như thể đó là một lớp trong định nghĩa mẫu:

template<class T> 
struct Example { 
    Example* parent; 
    T x, y; 
}; 

viết tắt là là viết tắt của Example<T>.

0

Hãy thử đặt

template <typename T> 

trên việc thực hiện VisitedSet :: getSize() - nhưng hãy cẩn thận rằng, nhìn chung, các lớp học và chức năng templated nên tất cả được inlined. Xem C++ faq here để biết thêm thông tin.

+0

khi tôi đặt 'template ' ngay trên dòng với 'int VisitedSet :: getSize() {', tôi nhận được chính xác lỗi tương tự. Có được ưu tiên là tôi không ** tách biệt nguyên mẫu khỏi định nghĩa? Đó có phải là ý nghĩa của nội tuyến trong bối cảnh này không? – synaptik

+0

@synaptic Bạn cũng cần sử dụng đối số mẫu trong lớp như tôi đã đề xuất trong các câu trả lời khác. –

3

Bạn muốn điều này:

template <class T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 
2

Bạn phải ghi rõ thông số mẫu trong định nghĩa cũng

template<class T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 

nếu không trình biên dịch có thể không phù hợp với nó để khai báo. Ví dụ, có thể có các chuyên môn cho một số kiểu tham số.

+0

Tôi hiểu. Cảm ơn mọi người. – synaptik

2

Bạn cần phải cho trình biên dịch của bạn biết rằng bạn đang thực hiện một phương pháp trong mẫu hàm:

template<typename T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 
Các vấn đề liên quan