编译以下代码时:
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/io.hpp>
namespace ublas = boost::numeric::ublas;
class Point {
ublas::vector<double> v(3);
}
我在下面收到此错误,抱怨构造函数中的值为3。 boost示例代码本身显示了使用构造函数初始化的向量的大小。
g++ -std=c++11 -w -I/usr/local/Cellar/boost/1.55.0/include -L/usr/local/Cellar/boost/1.55.0/ -l -lboost_system -c -o point.o point.cc
point.cc:38:29: error: expected parameter declarator
ublas::vector<double> v(3);
^
point.cc:38:29: error: expected ')'
point.cc:38:28: note: to match this '('
ublas::vector<double> v(3);
如果我用一个像
这样的空构造函数来运行它 ublas::vector<double> v();
然后运行正常。某处我犯了一个错误,因为BOOST示例代码看起来像这样。
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/io.hpp>
int main () {
using namespace boost::numeric::ublas;
vector<double> v (3);
for (unsigned i = 0; i < v.size (); ++ i)
v (i) = i;
std::cout << v << std::endl;
}
我想它在我的make文件中的某个地方或者其他东西虽然我不确定是什么。
我的整个Makefile看起来像这样:
CXX=g++
CXXFLAGS=-std=c++11 -w -I/usr/local/Cellar/boost/1.55.0/include -L/usr/local/Cellar/boost/1.55.0/ -l -lboost_system
BIN=orange
SRC=$(wildcard *.cc)
OBJ=$(SRC:%.cc=%.o)
all: $(OBJ)
$(CXX) -o $(BIN) $^
%.o: %.c
$(CXX) $@ -c $<
clean:
rm -f *.o
rm -f $(BIN)
非常感谢任何帮助
提前谢谢,
最大
答案 0 :(得分:2)
这是因为你在一个类中声明了一个成员变量。这意味着您必须在构造函数初始化列表中初始化变量:
class Point {
ublas::vector<double> v;
Point() : v(3) {}
};
还要注意,当你这样做时
ublas::vector<double> v();
你声明一个函数v
,它不带参数并返回一个向量。
答案 1 :(得分:2)
声明时的非静态数据成员初始化不支持()
语法,因为在这种形式下,它可能与函数声明混淆。所以你需要
class Point {
ublas::vector<double> v = ublas::vector<double>(3);
};
请注意,这也是一个有效的初始化:
class Point {
ublas::vector<double> v{3};
};
但是如果这个向量有一个构造函数,它接受一个initialization_list(如std::vector
那样),它会初始化v
以得到一个值为3.0
的元素。
或者,您可以使用C ++ 03样式并在构造函数初始化列表中初始化。但请注意,在这种情况下,您的类不再是聚合。这可能是也可能不是问题。例如:
class Point {
public:
Point() : v(3) {}
private:
ublas::vector<double> v;
};
另请注意尾随;
。