1

同じ名前の 2 つのメソッドを持つテンプレート化されたクラスが必要です。1 つは T& 型のパラメーターを受け取り、もう 1 つは Rational& をパラメーターとして受け取り、Rational は私のクラスです。これがテンプレートの特殊化と呼ばれるのか、単純なオーバーロードと呼ばれるのかはわかりません。もう1つのことは、hおよびcppファイルではなく、実装の宣言を含むhppファイルを持っていることです。

これに対する正しいsytanxは何でしょうか?

このようなもの:

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

再度、感謝します

4

2 に答える 2

1

Tの場合は、2 番目のオーバーロードを無効にする必要がありRationalます。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 で同じことを実現できます)

于 2013-09-10T16:25:10.750 に答える
0

解決策は、実際には、次のようにクラス外で特殊化されたメソッドを定義することです。

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

最初にコンパイルできなかった理由は、hpp ファイルであるこのファイルに実装があるためです (これが非常に悪いことはわかっていますが、これは演習であり、これが与えられた唯一のオプションです)。さらに、怪我に侮辱を加えるために、このファイルを2つのcppファイルに含めましたが、その時点でエラーが発生しました。

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

@DanielFrey、とにかく私を助けてくれてありがとう!

于 2013-09-11T08:33:36.713 に答える