C ++: ошибка «явная специализация в области, не связанной с пространством имен» - PullRequest
9 голосов
/ 19 сентября 2010
template<typename T1, typename T2>
class Bimap {
public:
    class Data {
    private:
        template<typename T> Data& set(T);
        template<> Data& set<T1>(typename T1 v) { /*...*/ }
    };
};

Это дает мне ошибку:

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

Я понимаю, что говорит ошибка. Но почему я не могу это сделать? И как я могу это исправить?

Ответы [ 2 ]

14 голосов
/ 19 сентября 2010

Один способ забыть шаблоны, перегрузка:

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

но вот трюк, который я иногда использую

Вы можете специализировать шаблон класса внутри класса:

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 голосов
/ 02 марта 2012

@ Альберт

У меня была похожая проблема, когда я хотел добавить «отделку-избыточную емкость» в изготовленный на заказ контейнер.Трюк подкачки std :: vector и изменение объявления существующего контейнера не были допустимыми параметрами.Итак, я пришел к следующему:

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

, используемому моим контейнером, например:

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

Вы также можете проверить этот ресурс .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...