Boost.Proto に慣れるために、ユーザー ガイドの TArray の例を適用して、固定されているが任意のサイズの浮動小数点ベクトル用のさらに別の式テンプレート ライブラリを構築しようとしています。最初に行うことは、ベクター クラスを定義することです。
typedef double real;
// Forward-declare an expression wrapper
template<typename Expr>
struct vector_expr_wrapper; // line 13
class FPVector : vector_expr_wrapper< proto::terminal< FPVector >::type > { // line 16
public:
FPVector() : numElements(0), elements(0) {}
FPVector(size_t n) : numElements(n), elements(new real[n]) {}
~FPVector() { delete[] elements; }
real& operator[](size_t i) { return elements[i]; }
template<typename Expr>
FPVector const& operator=(vector_expr_wrapper<Expr> vec_expr) {
for(size_t i=0; i<numElements; i++) {
elements[i] = vec_expr[i];
}
return *this;
}
private:
size_t numElements;
real * elements;
};
vector_expr_wrapper
また、operator[]
それ自体をオーバーロードして、端末に対して返されるvector_context
派生元で評価します。proto::callable_context
vector[index]
FPVector
コードをコンパイルして非常に単純なステートメント ( ) で呼び出すと、a = b + c;
次のエラー メッセージが表示されます。
../main.cpp:16:18: error: invalid use of incomplete type ‘struct vector_expr_wrapper<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<FPVector>, 0l> >’
../main.cpp:13:8: error: declaration of ‘struct vector_expr_wrapper<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<FPVector>, 0l> >’
../main.cpp: In function ‘int main()’:
../main.cpp:121:8: error: no match for ‘operator+’ in ‘b + c’
そして、g ++は可能な候補のものをリストします...それから私が理解しているのは、定義するvector_expr_wrapper
前にの定義全体を提供する必要があるということですが、他のすべてが(文法、評価コンテキスト...)に依存するFPVector
ため、そうすることができません。vector_expr_wrapper
FPVector
これを解決するにはどうすればよいですか (つまり、クラスをどのようにレイアウトすればよいですか)?
TArray の例は、配列クラスを非常に遅く定義し、その型をint[3]
before で指定することによって、この問題を回避しています。これは、私のコンテキストでは再現できないと思います。
ご助力ありがとうございます!