簡體   English   中英

模板成員函數專業化

[英]Template member function specialization

我有這個:

//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)
    {
        ...
    }
}

並且想要專門為運算符[](在類體外)的情況:

template<typename Elem, int D1>
typename matrix<Elem, D1, 1, 1>::matrix_deref matrix<Elem, D1, 1, 1>::operator[](int J)
{
    return M_ptr[J];
}

但是我收到了這個錯誤:

error C2244: 'matrix<Elem,D1,D2,D3>::operator []' : unable to match function definition to an existing declaration

如果沒有全班的完全專業化,我可以覆蓋這個成員函數嗎? 我該怎么辦? 謝謝。

您不能專門化模板類的非模板方法。 您只能專門化模板類本身。 或者您可以專門化任何模板方法(模板或非模板類)。

專門用於模板類的非模板方法毫無意義:編譯器需要知道整個類的外觀。 而你只是在告訴:嘿,我不關心課程,但我所知道的是這種方法的樣子。

只是專門為矩陣類:

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

你也不需要做?:檢查特質類,因為如果D2D31 ,它將始終選擇特征專業化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM