Конструктор Boost Vector size не работает

Когда я компилирую следующий код:

#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 в конструкторе. Сам пример кода надстройки показывает размер вектора, инициализируемого конструктором.

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

Решение

Инициализация нестатического элемента данных в точке объявления не поддерживает () синтаксис, поскольку в этой форме его можно спутать с объявлением функции. Так вам нужно

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;
};

Также обратите внимание на трейлинг ;,

2

Другие решения

Это потому, что вы объявляете переменную-член в классе. Это означает, что вы должны инициализировать переменную в списке инициализаторов конструкторов:

class Point {
ublas::vector<double> v;

Point() : v(3) {}
};

Также обратите внимание, что когда вы делаете

ublas::vector<double> v();

вы объявляете функцию v это не принимает аргументов и возвращает вектор.

2