在围绕nlopt优化库创建希望更好的OO包装器的上下文中,可以使用Eigen类型定义目标和约束函数签名和实现,我有以下问题:
编译:
namespace nlopt {
template <class Data>
struct Oracle {
typedef boost::tuple<double, VectorXd> (*f_t) (const VectorXd&, Data& data);
typedef boost::tuple<VectorXd, MatrixXd> (*mf_t)(const VectorXd&, Data& data);
};
};
/// Concrete Nlopt adapter search space implementation.
/**
* Concrete Nlopt adapter search space implementation.
*/
template <class ConstraintData>
class NloptSpace : public ContinuousSpaceInterface<double, VectorXd> {
public:
/// nonlinear constraints
struct NonlinearConstraint {
typename nlopt::Oracle<ConstraintData>::f_t func_; ConstraintData* data_; double tol_;
NonlinearConstraint(typename nlopt::Oracle<ConstraintData>::f_t func, ConstraintData* data, double tol) {
func_ = func;
data_ = data;
tol_ = tol;
}
};
// ...
};
typedef typename NloptSpace<ConstraintData>::NonlinearConstraint NonLinearConstraint;
const std::vector<NonLinearConstraint>& inequality_constraints = space.inequality_constraints();
然而,这个额外的行不能编译,并且给出了以下完全没有信息的错误:
std::vector<NonLinearConstraint>::const_iterator iter;
error: expected a ";"
std::vector<NonLinearConstraint>::const_iterator iter;
^
顺便说一下,如果你想知道我是否有正确的包含这也包括:
std::vector<int>::const_iterator iter;
这也编译:
inequality_constraints.begin(); // can't assign it to anything without the compiler error
不知何故,编译器并不喜欢NonLinearConstraint
模板作为向量常量迭代器,但它确实没有提供任何关于错误的提示。
我不希望有人帮我解决这个问题,但是给我一个指针,告诉我如何获得有关此编译器错误的更多信息。
答案 0 :(得分:1)
std::vector<NonLinearConstraint>::const_iterator
是一个从属名称 - 它取决于模板参数ConstraintData
。标准说(§14.6[name.res] / p2):
模板声明或定义中使用的名称,即 依赖于模板参数,假定不命名类型 除非适用的名称查找找到类型名称或名称是 由关键字
typename
限定。
因此,您需要使用
typename std::vector<NonLinearConstraint>::const_iterator iter;
//^^^^^^^^
否则,编译器会认为std::vector<NonLinearConstraint>::const_iterator
没有命名类型(尽管它知道,可以有std::vector
的特化,它定义了一个名为const_iterator
的成员变量。
现代编译器倾向于为此提供更好的错误消息。例如,g ++ 4.8产生:
test.cpp:46:2: error: need 'typename' before 'std::vector<typename NloptSpace<ConstraintData>::NonlinearConstraint>::const_iterator' because 'std::vector<typename NloptSpace<ConstraintData>::NonlinearConstraint>' is a dependent scope
std::vector<NonLinearConstraint>::const_iterator iter;
^
test.cpp:46:51: error: expected ';' before 'iter'
std::vector<NonLinearConstraint>::const_iterator iter;