Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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

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++_Templates - Fatal编程技术网

C++ 模板成员函数专门化

C++ 模板成员函数专门化,c++,templates,C++,Templates,我有这个: //forward declaration template<typename Elem, int D1 = 1, int D2 = 1, int D3 = 1> class matrix; template<typename Elem, int D1, int D2, int D3> struct matrix_deref_type_trait { typedef matrix<Elem, D2 == 1 ? 1 : D1, D3 == 1

我有这个:

//forward declaration
template<typename Elem, int D1 = 1, int D2 = 1, int D3 = 1>
class matrix;

template<typename Elem, int D1, int D2, int D3>
struct matrix_deref_type_trait
{
    typedef matrix<Elem, D2 == 1 ? 1 : D1, D3 == 1 ? 1 : D2, 1> matrix_deref;
};

template<typename Elem, int D1>
struct matrix_deref_type_trait<Elem, D1, 1, 1>
{
    typedef Elem matrix_deref;
};

template<typename Elem, int D1, int D2, int D3>
class matrix:public object
{
public:
    typedef typename matrix_deref_type_trait<Elem, D1, D2, D3>::matrix_deref matrix_deref;

    inline matrix_deref operator[](int J)
    {
        ...
    }
}
//转发声明
样板
类矩阵;
样板
结构矩阵类型特征
{
类型定义矩阵矩阵定义;
};
样板
结构矩阵类型特征
{
类型定义元素矩阵;
};
样板
类矩阵:公共对象
{
公众:
typedef typename matrix_deref_type_trait::matrix_deref matrix_deref;
内联矩阵_deref运算符[](int J)
{
...
}
}
并希望为操作符[](在类主体之外)专门化一个案例:

模板
typename矩阵::矩阵\定义矩阵::运算符[](int J)
{
返回M_ptr[J];
}
但我得到了一个错误:

error C2244: 'matrix<Elem,D1,D2,D3>::operator []' : unable to match function definition to an existing declaration
错误C2244:“矩阵::运算符[]”:无法将函数定义与现有声明匹配

我可以在不完全专门化整个类的情况下重写这个成员函数吗?我该怎么办?谢谢。

您不能专门化模板类的非模板方法。您只能专门化模板类本身。或者您可以专门化任何(模板或非模板类)的模板方法


专门化模板类的非模板方法毫无意义:编译器需要知道整个类的外观。你只是说:嘿,我不关心类,但我知道这个方法是什么样子。

你不能专门化模板类的非模板方法。您只能专门化模板类本身。或者您可以专门化任何(模板或非模板类)的模板方法


专门化模板类的非模板方法毫无意义:编译器需要知道整个类的外观。你只是告诉我:嘿,我不关心这个类,但我知道这个方法会是什么样子。

只需专门化你的矩阵类:

template<typename Elem, int D1>
class matrix<Elem,D1,1,1>
{
public:
    typedef typename matrix_deref_type_trait<Elem, D1, 1, 1>::matrix_deref matrix_deref;//this line 

    inline matrix_deref operator[](int J)
    {
        std::cout << "special\n";
    }
};
模板
类矩阵
{
公众:
typedef typename matrix\u deref\u type\u trait::matrix\u deref matrix\u deref;//此行
内联矩阵_deref运算符[](int J)
{

std::cout只需专门化矩阵类:

template<typename Elem, int D1>
class matrix<Elem,D1,1,1>
{
public:
    typedef typename matrix_deref_type_trait<Elem, D1, 1, 1>::matrix_deref matrix_deref;//this line 

    inline matrix_deref operator[](int J)
    {
        std::cout << "special\n";
    }
};
模板
类矩阵
{
公众:
typedef typename matrix\u deref\u type\u trait::matrix\u deref matrix\u deref;//此行
内联矩阵_deref运算符[](int J)
{

std::cout@Nik这只是一个不相关的指针…我从类中删除这些声明以澄清问题。@Nik这只是一个不相关的指针…我从类中删除这些声明以澄清问题。:)但我认为我需要复制并粘贴其他成员到专门化(有很多成员)因此,这将是一个复制粘贴+删除D2和D3类型参数,并用常量重放。我不认为它会这么长?我认为D2和D3是必要的,因为它应该支持多达3-d矩阵。不,你需要专门化吗?你专门处理D2和D3为1的情况,对吗?啊,我明白你的意思。谢谢:)似乎这是唯一的方法,但我想我需要复制并粘贴其他成员到专门化(有很多)因此,这将是一个复制粘贴+删除D2和D3类型参数,并用常量重放。我不认为它会这么长?我认为D2和D3是必要的,因为它应该支持多达3-d矩阵。不,你需要专门化吗?你专门处理D2和D3为1的情况,对吗?啊,我明白你的意思。谢谢:)似乎这是唯一的方法模板是非常棘手的工具。它太容易制作复杂和不可读的代码。模板是非常棘手的工具。它太容易制作复杂和不可读的代码。