2013-04-22 24 views
13

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ó.

+3

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

+0

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

Trả lời

13

Mẫu chức năng không thể là một phần chuyên biệt, nhưng hầu hết thời gian, bạn có thể sử dụng mẹo đại biểu đến lớp. Trong ví dụ, bạn sẽ thấy như sau:

struct Value { 
    template<typename T> 
    T getValue() { 
    return Impl_getValue<T>::call(*this); 
    } 
}; 

template <typename T> 
struct Impl_getValue 
{ 
    static T call(Value &v) { 
    //primary template implementation 
    } 
}; 

template <typename T> 
struct Impl_getValue<T*> 
{ 
    static T* call(Value &v) { 
    return reinterpret_cast<T*>(v.val1); 
    } 
}; 
+0

Tôi có một câu hỏi, trình biên dịch sẽ loại bỏ các cuộc gọi thêm để Impl_getValue :: call()? – Kunashu

+0

@Kunashu Nếu người tối ưu hóa có giá trị bất cứ điều gì, nó sẽ loại bỏ một cuộc gọi như vậy. – Angew

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