为了让自己熟悉 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]
之前指定它的类型,我认为我无法在我的上下文中重现。
非常感谢您的帮助!