Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:“错误”;非命名空间范围中的显式专门化”; 模板 类Bimap{ 公众: 类数据{ 私人: 模板数据集(T); 模板数据和集(typename T1 v){/*…*/} }; };_C++_Templates - Fatal编程技术网

C++ C++;:“错误”;非命名空间范围中的显式专门化”; 模板 类Bimap{ 公众: 类数据{ 私人: 模板数据集(T); 模板数据和集(typename T1 v){/*…*/} }; };

C++ C++;:“错误”;非命名空间范围中的显式专门化”; 模板 类Bimap{ 公众: 类数据{ 私人: 模板数据集(T); 模板数据和集(typename T1 v){/*…*/} }; };,c++,templates,C++,Templates,这给了我一个错误: 错误:在非命名空间范围“class Bimap::Data”中显式专门化 我明白错误在说什么。但为什么我不能这么做?如何修复它?单向忘记模板,重载: template<typename T1, typename T2> class Bimap { public: class Data { private: template<typename T> Data& set(T); template<

这给了我一个错误:

错误:在非命名空间范围“class Bimap::Data”中显式专门化


我明白错误在说什么。但为什么我不能这么做?如何修复它?

单向忘记模板,重载:

template<typename T1, typename T2>
class Bimap {
public:
    class Data {
    private:
        template<typename T> Data& set(T);
        template<> Data& set<T1>(typename T1 v) { /*...*/ }
    };
};
但这里有一个技巧,我有时会用到

您可以在类中专门化类模板:

Data& set(T1 v) { /*...*/ }
类{
模板
结构函数{
静态空隙率(T);
};
模板
结构函数{
...
};
模板
空函数(T){返回函数(T)::apply(T);}
@Albert

当我想向定制容器添加“修剪过剩容量”时,我遇到了类似的问题。std::vector交换技巧和更改现有容器的声明都是无效的选项。因此我提出了以下建议:

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); }
模板结构DeleteImp
{
静态无效修剪(T*to,无符号整数计数);
};
模板结构DeleteImp
{
静态无效修剪(T*to,无符号整数计数){}
};
模板结构DeleteImp
{
静态无效修剪(T*to,无符号整数计数)
{

对于(未签名int i=0),我注意到一些编译器将支持这个。在C++中,您不显式专门化成员模板而不显式地封闭封闭类模板。要做到这一点是不可能的。你必须使用重载。或者完全重新设计整件事。MSVC++是一个编译器,它允许将此作为一个扩展。+1,是的,这是唯一正确实现函数模板专门化的明智方法。你可以显式地专门化普通类中的嵌套类模板。但你不能显式专门化一个nested类模板在另一个类模板中。实现后者的唯一方法是显式地专门化封闭模板和嵌套模板。@Andrey我不确定模板类中的模板类。无论如何,可能会有一些变化
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);