0

次のコードをコンパイルすると:

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

メイクファイルか何かのどこかにあると思いますが、実際にはわかりません。

私の 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)

どんな助けでも大歓迎です。
前もってありがとう、
マックス

4

2 に答える 2

2

宣言の時点での非静的データ メンバーの初期化は、()構文をサポートしていません。この形式では、関数宣言と混同される可能性があるためです。だからあなたが必要です

class Point {
    ublas::vector<double> v = ublas::vector<double>(3);
};

これも有効な初期化であることに注意してください。

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

しかし、このベクターに初期化リストを取るコンストラクターがある場合 ( std::vectorそうであるように)、それはvvalue の 1 つの要素を持つように初期化されます3.0

または、C++03 スタイルを使用して、コンストラクターの初期化リストで初期化することもできます。ただし、この場合、クラスはもはや集約ではないことに注意してください。これは問題になる場合とそうでない場合があります。例:

class Point {
 public:
    Point() : v(3) {}
 private:
    ublas::vector<double> v;
};

また、末尾の;.

于 2014-01-10T09:57:12.113 に答える
2

クラスでメンバー変数を宣言するためです。つまり、コンストラクターの初期化リストで変数を初期化する必要があります。

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

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

するときも注意してください。

ublas::vector<double> v();

v引数を取らず、ベクトルを返す関数を宣言しています。

于 2014-01-10T09:53:57.737 に答える