C ++:错误“非命名空间范围中的显式特化”

时间:2010-09-19 16:05:50

标签: c++ templates

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 个答案:

答案 0 :(得分:14)

忘记模板,重载:

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

答案 1 :(得分:0)

@Albert

当我想在自定义容器中添加“trim-excess-capacity”时,我遇到了类似的问题。 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);

您可能还想查看此resource