簡體   English   中英

模板類的重載/專業化方法

[英]Overloading/Specializing Method Of A Templated Class

我想要一個模板化類,該類類具有兩個具有相同名稱的方法:一個采用類型為T&的參數,另一個采用Rational&作為參數,其中Rational是我的類。 我不確定這是被稱為模板專門化還是僅僅是簡單的重載。另一件事是我沒有h和cpp文件,而是一個hpp文件,其中包含實現的聲明。

什么是正確的總管呢?

像這樣的東西:

template <class T> class Matrix
{

    bool hasTrace (Rational& trace) const
    {
    }

    bool hasTrace (T& trace) const
    {
    }
}

只有以下代碼無法編譯,並且出現編譯錯誤:

..\/Matrix.hpp:200:7: error: 'bool Matrix<T>::hasTrace(T&) const [with T = Rational]' cannot be overloaded
..\/Matrix.hpp:180:7: error: with 'bool Matrix<T>::hasTrace(Rational&) const [with T = Rational]'

我現在看了本教程: 在此處輸入鏈接描述

在模板專門化下,它說我想完成的工作可以通過在類定義之外定義專門的功能來完成,同時用希望為該功能重新定義功能的特定類型替換模板類型:

bool Matrix<Rational>::hasTrace (Rational& trace) const
{
}

但是現在我得到這個錯誤:

..\/Matrix.hpp:227:6: error: specializing member 'Matrix<Rational>::hasTrace' requires 'template<>' syntax

再次感謝

如果TRational則需要禁用第二個重載。 對於C ++,您將使用一種特殊化方法:

template <class T> class Matrix
{
    bool hasTrace (Rational& trace) const
    {
    }

    bool hasTrace (T& trace) const
    {
    }
};

template<> class Matrix< Rational >
{
    bool hasTrace (Rational& trace) const
    {
    }
};

使用C ++ 11,您還可以使用std::enable_if

#include <type_traits>

template <class T> class Matrix
{
    bool hasTrace (Rational& trace) const
    {
    }

    typename std::enable_if< !std::is_same< T, Rational >::value, bool >::type
    hasTrace (T& trace) const
    {
    }
};

(或者您可以使用Boost的類型特征在C ++ 98中實現相同的功能)

解決方案的確是在類外部定義專用方法,如下所示:

template <> bool Matrix<Rational>::hasTrace (Rational& trace) const
{
}

一開始沒有編譯的原因是我在這個文件中有一個實現,它是一個hpp文件(我知道這確實很糟糕,但這是一個練習,這是我們得到的唯一選擇)。 然后,為了增加侮辱性傷害,我將此文件包含在兩個cpp文件中,這時出現錯誤:

multiple definition of `Matrix<Rational>::hasTrace(Rational&) const'

@DanielFrey,仍然感謝您嘗試幫助我!

暫無
暫無

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

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