2

次のような「float2、unsigned int」ペアでテンプレート化されたベクトルがあります。

std::vector<std::pair<float2, unsigned int>> myVec;

そして、そのようなペアをベクトルに追加しようとしています:

unsigned int j = 0;
float2 ab = {1.0, 2.0};
myVec.push_back(std::make_pair(ab, j));

これは私が期待する方法ですが、コンパイルしようとするとエラーが発生します:

1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(163): error C2536: 'std::_Pair_base<_Ty1,_Ty2>::std::_Pair_base<_Ty1,_Ty2>::first' : cannot specify explicit initializer for arrays
1>          with
1>          [
1>              _Ty1=float2 ,
1>              _Ty2=unsigned int
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(166) : see declaration of 'std::_Pair_base<_Ty1,_Ty2>::first'
1>          with
1>          [
1>              _Ty1=float2 ,
1>              _Ty2=unsigned int
1>          ]
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\utility(247) : see reference to function template instantiation 'std::_Pair_base<_Ty1,_Ty2>::_Pair_base<float(&)[2],unsigned int&>(_Other1,_Other2)' being compiled
1>          with
1>          [
1>              _Ty1=float2 ,
1>              _Ty2=unsigned int,
1>              _Other1=float (&)[2],
1>              _Other2=unsigned int &
1>          ]
1>          myTest.cpp(257) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2>::pair<float2(&),unsigned int&>(_Other1,_Other2)' being compiled
1>          with
1>          [
1>              _Ty1=float2,
1>              _Ty2=unsigned int,
1>              _Other1=float2 (&),
1>              _Other2=unsigned int &
1>          ]**strong text**

このデータ型をペア保持ベクトルに追加する正しい方法は何ですか?

float2 型は次のように定義されます。

typedef float        float2[2];
4

2 に答える 2

5

C++ 配列は、ほぼすべての使用でポインターに減衰します。変更float2:

typedef std::array<float, 2> float2;

または、C++11 をまだ持っていない場合は、boost::array.

于 2013-09-15T17:00:01.257 に答える
2

配列は通常の値のようにコピーできないため、これは機能しません。

理想的には、何か他のものを使用するでしょう - 多分 astd::arrayまたはあなたのfloat2内部に構造体を持っています。

このタイプのペアがどうしても必要な場合は、次のようにすることができます。

unsigned int j = 0;
float2 ab = {1.0, 2.0};

std::pair<float2,int> new_element;
new_element.first[0] = ab[0];
new_element.first[1] = ab[1];
new_element.second = j;

myVec.push_back(new_element);

これをたくさん行う必要がある場合は、関数を作成できます。完全な例を次に示します。

#include <vector>
#include <utility>

typedef float float2[2];

std::pair<float2,unsigned int>
  make_pair(const float2 &first,unsigned int second)
{
  std::pair<float2,unsigned int> result;
  result.first[0] = first[0];
  result.first[1] = first[1];
  result.second = second;
  return result;
}

int main(int,char**)
{
  unsigned int j = 0;
  float2 ab = {1.0, 2.0};
  std::vector<std::pair<float2, unsigned int> > myVec;
  myVec.push_back(make_pair(ab, j));
  return 0;
}
于 2013-09-15T17:03:03.260 に答える