-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;
inline T& operator()( size_t index );
inline const T& operator()( size_t index ) const;
template <size_t N> Vector<N,T> operator()(const  colon &cex) const;
.
.
}

および対応する実装

template< size_t M, typename T >
template< size_t N>
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;

 }
}

機能をテストするために使用されるコードは次のとおりです。

bool ok = true;

Vector< 4, double > v;
double data[] = { 1, 2, 3, 4 };

v.iter_set( data, data+4 );//just puts elements of data inside v with the same type

// test  Vector colon
{
    bool ok = true;
    Vector<3,long> test;
    test=v(colon(2,4));//Problem

}

今のエラーは

C2664: 'const double &Vector<M,T>::operator ()(size_t) const' : 
cannot convert parameter 1 from 'colon' to 'size_t'

コンパイラの出力は

error C2664: 'const double &Vector<M,T>::operator ()(size_t) const' : 
cannot convert parameter 1 from 'colon' to 'size_t'
with
[
M=4,
T=double
]
No user-defined-conversion operator available that can perform this conversion, 
or the operator cannot be called

???? 助けていただければ幸いです

4

2 に答える 2

1
template <size_t N> Vector<N,T> operator()(const  colon &cex) const;

自体は N でテンプレート化されており、N の値はコロンから推定できないため、オーバーロード セットでは考慮されません。

于 2012-09-25T11:10:44.697 に答える
0

言いたいことが多すぎてコメントに収まらないので、これに対する回答を使用します(ただし、質問に直接回答するわけではありません)。

ユースケースがどうなるかを知る必要があります。ランタイム変数で多くのことを行う場合、すべてをテンプレートに実装しても意味がありません。テンプレートのみを使用する場合は、 も使用する必要がありますclass colon。お二人にヒントをお伝えします。

最初に、コメントよりも詳細に問題を説明させてください。

があると仮定して、いくつかの使用例を見てみましょうVector<5, int> vec;

ケース「コンパイル時のサイズ」:

//get the entries with indices 1 to 3 (including)
Vector<3, int> vec2 = vec(colon(1, 3));

このコードの場合、コンパイル時にすべてがわかっているため、コンパイル時にこれを行うことができます (ただし、この目的には不要です)。

ケース「実行時サイズ」:

//we get the variables a and b as input from the user at runtime
Vector<?, int> vec2 = vec(colon(a, b));

それらab変数を参照してください。プログラムを作成するときに、それらが保持する値を知っていますか? ユーザーが入力する必要があるため、できません。ユーザーが何を入力するかを (偶然に) 知っている人は、0:0または0:4またはである可能性があります。42:1337の値がわからず、 の値abわからない?場合は、コンパイル時にすべてのテンプレート引数を知る必要があるため、コンパイル時に知る必要があります。

今、あなたは自分が何をしたいのかを知る必要があります。(実行時パラメーター) を使用したいですか、それとも(コンパイル時パラメーター) のa:bような定数のみを入力したいですか。1:3これに応じて、実装方法を選択する必要がありますVector<n,T>::operator()

Vectorのサイズが実行時の値に依存するとすぐに、コンパイル時に決定できないため、正しいサイズのベクトルを返すことができません。

ただし、コンパイル時サイズと実行時サイズのベクトルおよびコロン クラスを実装して、より複雑な実装を犠牲にして両方を有効にすることもできます。彼らは次のパターンを与えるでしょう:

CompileTimeVector CompileTimeVector::operator()(CompileTimeColon);
RunTimeVector CompileTimeVector::operator()(RunTimeColon);
RunTimeVector RunTimeVector::operator()(CompileTimeColon);
RunTimeVector RunTimeVector::operator()(RunTimeColon);

このパターンは、ベクトルとコロンの実行時型とコンパイル時型の間で相互運用する操作に必要です。

于 2012-09-25T16:47:20.973 に答える