2010-09-19 31 views
9
template<typename T1, typename T2> 
class Bimap { 
public: 
    class Data { 
    private: 
     template<typename T> Data& set(T); 
     template<> Data& set<T1>(typename T1 v) { /*...*/ } 
    }; 
}; 

Điều đó mang lại cho tôi những lỗi:C++: lỗi "chuyên môn hóa rõ ràng trong phạm vi không gian tên"

error: explicit specialization in non-namespace scope 'class Bimap<T1, T2>::Data'

tôi hiểu những gì các lỗi nói. Nhưng tại sao tôi không thể làm điều này? Và làm thế nào tôi có thể sửa nó?

+2

Đáng chú ý rằng một số trình biên dịch sẽ hỗ trợ điều này. – Puppy

+1

Trong C++ bạn không thể chuyên biệt một cách rõ ràng một mẫu thành viên mà không rõ ràng chuyên mẫu lớp kèm theo. Những gì bạn đang cố gắng (cụ thể là, chuyên môn) để làm là * không thể *. Bạn phải sử dụng quá tải. Hoặc thiết kế lại toàn bộ điều. MSVC++ là một trình biên dịch cho phép điều này như là một phần mở rộng. – AnT

Trả lời

14

Một cách quên mẫu, quá tải:

Data& set(T1 v) { /*...*/ } 

nhưng đây là một thủ thuật mà tôi sử dụng đôi khi

bạn có thể chuyên lớp mẫu trong lớp:

class { 
    template<typename T> 
    struct function_ { 
     static void apply(T); 
    }; 

    template<> 
    struct function_<int> { 
     ... 
    }; 

    template<typename T> 
    void function(T t) { return function_<T>::apply(t); } 
+0

+1, vâng, cách duy nhất để có được chuyên môn mẫu chức năng đúng. –

+4

Bạn * có thể * rõ ràng chuyên một mẫu lớp lồng nhau trong một lớp * bình thường *. Nhưng bạn * không thể * một cách rõ ràng chuyên một mẫu lớp lồng nhau trong một lớp * mẫu * khác. Cách duy nhất để làm việc sau là rõ ràng chuyên * cả * mẫu kèm theo và mẫu lồng nhau. – AnT

+0

@Andrey Tôi không chắc chắn về lớp mẫu bên trong lớp mẫu. ở mức nào, một số biến thể của lừa có thể được thực hiện – Anycorn

0

@Albert

Tôi đã gặp phải sự cố tương tự khi tôi muốn thêm "công suất dư thừa" vào tùy chỉnh làm thùng chứa. Thủ thuật std :: vector swap và thay đổi việc khai báo vùng chứa hiện tại không phải là các tùy chọn hợp lệ. Vì vậy, tôi đã đi lên với điều này:

template <class T, bool isPtr> struct DeleteImp 
{ 
    static void Trim(T* to, unsigned int count); 
}; 

template <class T> struct DeleteImp<T, false>  
{ 
    static void Trim(T* to, unsigned int count) {} 
}; 

template <class T> struct DeleteImp<T, true>   
{ 
    static void Trim(T* to, unsigned int count) 
    { 
     for(unsigned int i=0; i<count; i++) 
      delete to[i]; 
    } 
}; 

sử dụng bởi container của tôi như thế này:

DeleteImp<T, TypeTraits<T>::isPointer>::Trim(buf + length, truelength-length); 

Bạn cũng có thể muốn kiểm tra resource này.

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