Xin chào, tôi đang gặp sự cố với chuyên môn từng phần. Những gì tôi muốn làm là có một lớp có chức năng thành viên mẫu sẽ giải thích một giá trị đã cho cho một giá trị được chỉ định bởi người dùng. Ví dụ tên lớp là Value
và đây là một đoạn của những gì tôi muốn làm:Nhận "sử dụng bất hợp pháp đối số mẫu rõ ràng" khi thực hiện một chuyên môn một phần con trỏ cho một phương thức lớp học
int *ptr1 = new int;
*ptr1 = 10;
Value val1 = ptr1;
int *ptr2 = val1.getValue<int*>();
Value val2 = 1;
int testVal = val2.getValue<int>();
Dưới đây là cách tôi thực hiện lớp như:
struct Value {
Value(void *p) : val1(p){}
Value(int i) : val2(i){}
template<typename T>
T getValue();
void *val1;
int val2;
};
template<typename T>
T* Value::getValue<T*>() {
return reinterpret_cast<T*>(val1);
}
template<>
int Value::getValue<int>() {
return val2;
}
Khi tôi biên soạn tôi nhận được như sau lỗi:
error C2768: 'Value::getValue' : illegal use of explicit template arguments
về cơ bản nó phàn nàn về con trỏ mẫu một phần của mã:
template<typename T>
T* Value::getValue<T*>() {
return reinterpret_cast<T*>(val1);
}
Tôi biết vấn đề này có thể được thực hiện với một công đoàn đơn giản, nhưng mã này là một phiên bản rút gọn của một mã lớn hơn.
Có ai đó biết vấn đề có thể là gì không? Những gì tôi muốn làm là tách một mã cho khi sử dụng con trỏ và khác cho khi không sử dụng con trỏ. Tôi thực sự bị mắc kẹt và tôi luôn luôn điều tra thay vì hỏi, nhưng tôi đã không tìm thấy bất kỳ thông tin tốt về nó.
Mẫu chức năng không thể chuyên trách một phần; chỉ các mẫu lớp mới có thể. – Angew
Ok yeah đó có thể là nó. Tôi nhớ đọc về nó trong C++ Thiết kế hiện đại, chức năng đó không thể là một phần. Tôi nghĩ vì các chức năng của thành viên trong đó một phần của một lớp bạn có thể thoát khỏi nó. Tôi đoán không :(Cảm ơn: D – Kunashu