Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++_Templates_Inner Classes_Template Specialization - Fatal编程技术网

C++ 嵌套模板类专门化的语法

C++ 嵌套模板类专门化的语法,c++,templates,inner-classes,template-specialization,C++,Templates,Inner Classes,Template Specialization,我试图找出嵌套模板类显式专门化的正确语法。以下代码将更好地说明: struct Column_Major; struct Row_Major; template<size_t rows, size_t cols, typename T, typename Allocator> class Matrix { /* bunch of members */ template <typename storage = Column_Major> clas

我试图找出嵌套模板类显式专门化的正确语法。以下代码将更好地说明:

struct Column_Major;
struct Row_Major;

template<size_t rows, size_t cols, typename T, typename Allocator>
class Matrix
{

    /* bunch of members */
    template <typename storage = Column_Major>
    class Iterator
    {
        /* bunch of members */
    };
};
struct Column\u Major;
主修结构;
模板
类矩阵
{
/*一群成员*/
模板
类迭代器
{
/*一群成员*/
};
};

我想为
模板类Matrix::Iterator编写一个显式专门化。对于显式专门化,您需要先专门化外部类,然后才能专门化内部类

有一种解决方法使用部分专门化:

template<size_t rows, size_t cols, typename T, typename Allocator>
class Matrix
{

    //                           Notice the additionnal dummy parameter
    //                                       vvvvvvvvvvvvv
    template <typename storage = Column_Major, bool = true>
    class Iterator
    {
    };

    // Specialization
    template <bool dummy>
    class Iterator<Row_Major, dummy>
    {
    };
};
模板
类矩阵
{
//请注意附加的dummy参数
//VVVVVVV
模板
类迭代器
{
};
//专业化
模板
类迭代器
{
};
};

我很惊讶嵌套类的模板参数不是父类的参数

嵌套类可以使用父类的模板参数,这使嵌套类与父类的关系更加紧密。您使用迭代器这个词表明这是好的,迭代器肯定在父级包含的相同类型上进行迭代

我会这样做:

template <class T>
class Outer
{
public:
    class Inner
    {
        void Fn( T in )
        {
        }
    };
};

// specialisation
void Outer<double>::Inner::Fn( double in )
{

}
模板
类外部
{
公众:
班级内部
{
空隙Fn(T英寸)
{
}
};
};
//专业化
空心外部::内部::Fn(双进)
{
}

使用C++11,您可以使Synxis answer(使用默认的伪参数)更加清晰:

/// template <typename X>, not needed for the example
struct Outer
{
private:
    template <typename A, typename D = void>
    struct Inner
    {
        Inner()  { cout << "default" << endl; }
    };
    template <typename D>
    struct Inner<int,D>
    {
        Inner()  { cout << "int" << endl; }
    };  
public:
    template <typename T>
    using  Nested = Inner<T>;
};
///模板,示例中不需要
结构外部
{
私人:
模板
结构内部
{

Inner(){矩阵本身不应该知道它的存储类型吗?[temp.expl.spec]/16"在类模板的成员或出现在命名空间作用域中的成员模板的显式专门化声明中,成员模板及其某些封闭类模板可以保持非专门化状态,但如果类成员模板的封闭类模板不是显式的,则该声明不应显式专门化该类成员模板“和/2”应在包含专门化模板的命名空间中声明显式专门化"@n、 m.,在这种设计中,矩阵的存储类型始终是列主迭代器。除其他原因外,具有行主迭代器的功能旨在允许从流中读取矩阵的内容,其中源数据必须采用行主格式。尽管这个答案在技术上是有效的,但我认为OP希望用户使用一个按行或按列的迭代器,无需编写两个不同版本的代码。该参数不包含在矩阵模板参数中。我会在行迭代器和列迭代器嵌套类中各有一个。@user1158692,正如我在上一篇文章的评论中提到的,矩阵中的数据总是存储在colu中mn主格式。我在这里尝试创建一个简单的正向迭代器,它按行主顺序逐步遍历元素,以促进某些功能。矩阵的用户对于矩阵数据的存储没有任何选择。@user1158692,我想我可以有两个独立的子类-一个用于列主迭代器,另一个用于列主迭代器row major,我宁愿找到一个模板化的解决方案,原因有很多,正如前面提到的Synxis,更不用说保持接口的干净和一致性了成员?一个半打中的六个。无论哪种方法,您需要两倍于两倍的迭代器类型的两倍代码,但由于STL不使用模板参数来定义迭代器是否为反向,而是使用两个不同的嵌套类,我想用同样的方法来定义行迭代器或列迭代器。角括号更少ets也意味着患近视的几率更小。;-,谢谢你的帮助。我会在一段时间内测试一下。这绝对是我所希望的方法。基本上,嵌套类可以部分专用于非专用类(或部分专用类)外部类,但只能在外部类也显式专用时显式专用。这准确吗?