Когда я компилирую следующий код:
#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)
Любая помощь будет принята с благодарностью.
Заранее спасибо,
Максимум
Инициализация нестатического элемента данных в точке объявления не поддерживает ()
синтаксис, поскольку в этой форме его можно спутать с объявлением функции. Так вам нужно
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;
};
Также обратите внимание на трейлинг ;
,
Это потому, что вы объявляете переменную-член в классе. Это означает, что вы должны инициализировать переменную в списке инициализаторов конструкторов:
class Point {
ublas::vector<double> v;
Point() : v(3) {}
};
Также обратите внимание, что когда вы делаете
ublas::vector<double> v();
вы объявляете функцию v
это не принимает аргументов и возвращает вектор.