1

私はどういうわけかテンプレートに不慣れで、行列とベクトル操作を C++ に提供するライブラリを変更しようとしています。このような操作を処理するために operator() をオーバーロードしようとしているベクトル クラスがあります。 (2:5) は、元のベクトルの要素 2、3、4、5 を持つベクトルを返します。コロン (2:5) が (2:5) 効果を次のように表すコロンというクラスを使用しています。 c++ には演算子がないことがわかりました: . 適切な紹介をしたことを願っています。関連するコードは次のとおりです

ベクトル クラス

template< size_t M, typename T = float >
class Vector
{
public:
typedef T   value_type;
Vector operator-( const Vector& other ) const;
template <size_t N, typename T> Vector<N,T> operator()(const  colon &cex) const;
.
.
}

および対応する実装

template< size_t M, typename T >
template< size_t N,T>
Vector<N,T>
Vector<M,T>::operator()( const colon &cex ) const
{
long i, ii, st = 0, in = 0, en = 0, s;
cex.apply(M, st, in, en, s);
if (s && (st>0) && (st>M))
{
Vector<N,T> result;
for (i=st,ii=0;i+=in,ii++;i<=en,ii<N)
{
result(ii)=array(i);
return result;
}

}
return 0;
}

ここでの return 0 は単なるプレースホルダーであり、空のベクトルを返す必要があります。コロンクラス(別のライブラリから取得し、私が変更しました)。

class colon
{
public:
/// Colon expression '(:)'
colon() { _flag = 'a'; }
/// Colon expression of type '(2:5)'
colon(long s, long e) { _s = s; _i = 1; _e = e; _flag = 'r'; }
void apply(long s, long &f, long &i, long &l, long &n) const;

private:
/// Type of colon expression.
char _flag;
/// First index.
long _s;
/// Increment.
long _i;
/// Last index.
long _e;

}; /* class colon */

関連する実装は

void
colon::apply(long n, long &st, long &in, long &en,
     long &le) const
{
switch (_flag)
{
    case 'r':
        if ((_i == 0 ) || ((_e - _s) / _i < 0 )) le = 0;
        else
        {
            st = _s;
            in = _i;
            en = _e - (_e - _s) % _i;
            le = (_e - _s) / _i + 1;
        }
        break;
    case 'a':
        if (n)
        {
            st = 1;
            in = 1;
            en = n;
            le = n;
        }
        else le = 0;
        break;

 }
}

このコードをコンパイルすると、常にエラーが発生します

エラー 1 エラー C2244: 'Vector::operator ()': 関数定義を既存の宣言と一致させることができません

そしてコンパイラの出力は

error C2244: 'Vector<M,T>::operator ()' : unable to match function 
definition to an existing declaration

definition
'Vector<N,T> Vector<M,T>::operator ()(const colon &) const'

existing declarations
'Vector<N,T> Vector<M,T>::operator ()(const colon &) const'

ここで私が間違っていることは何ですか?

4

2 に答える 2

1

宣言では、次のように記述します。

template< size_t M, typename T = float >
class Vector
{
template <size_t N, typename T> 
Vector<N,T> operator()(const  colon &cex) const

そしてあなたの定義では次のように書きます:

template< size_t M, typename T >
template< size_t N,T>
Vector<N,T>
Vector<M,T>::operator()( const colon &cex ) const

2 番目のテンプレート行の違いに注意してください。

template <size_t N, typename T> 

対。

template< size_t N,T>

あなたはそこに欠けてtypenameいます。したがって、型を T に渡す代わりに、 のインスタンスが渡されることを期待します (これは、 が整数型のT場合にのみ可能です)。T

これは、宣言と定義が実際には異なり、エラーの原因がどこにあるかを示しています。

あなたの2番目Tは最初のものを隠すので(これは許可されていません-コメントを参照してください)、2番目の名前を変更して定義Tに追加するか、2番目を完全typenameに削除したいと思います。T

于 2012-09-25T10:14:35.040 に答える
1

最初の問題は、テンプレート関数の引数の書き方が間違っていることです: template<size_t N,T>. それtemplate<size_t N, typename T>以外の場合は、型ではないテンプレート パラメーター (の特定の値) と見なされますT

2 つ目の問題は、関数テンプレートのパラメーター名Tがあいまいであることです。コンパイラはT、クラス テンプレート パラメータまたは関数 1 から、どちらを使用するかを認識できませんでしたか? 関数とクラス テンプレートのパラメーターは無関係であることを忘れないでください。したがって、名前を変更する必要があります。

template<size_t M, typename T> class Vector
{
public:

template <size_t N, typename X> Vector<N,X> operator()() const;
};

template<size_t M, typename T>
template<size_t N, typename X> Vector<N,X> Vector<M,T>::operator()() const
{ 
}

しかし、実際にはクロスタイプの操作が必要なくX、常に同じタイプになるT場合は、関数でスキップしてサイズのみでパラメーター化できます。

template<size_t M, typename T> class Vector
{
public:

template <size_t N> Vector<N,T> operator()() const;
};

template<size_t M, typename T>
template<size_t N> Vector<N,T> Vector<M,T>::operator()() const
{ 
}
于 2012-09-25T10:35:05.367 に答える