0

これは、アイテムがマップに存在しないことを意味しますか?これが真実であることを示す文書化された回答を見つけることができませんでした。

これが私が地図に追加するところです:

void Shader::addAttribute(const string attribute) 
{
    attributeList[attribute] = glGetAttribLocation(program, attribute.c_str());
}

私は次のように地図に追加します:

shader.addAttribute("position");

これが私が地図からデータを取得する場所です:

//An indexer that returns the location of the attribute
GLuint Shader::operator [](const string attribute) 
{
    return attributeList[attribute];
}

デバッグログに値を出力すると、「locationis-1」が表示されます。

4

2 に答える 2

4

マップに挿入するキーの値は-1でなければなりません。

にとって:

std::map<int, int> map;
std::cout << (map [5]);

x(この場合は5)がコンテナ内のどの要素のキーとも一致しない場合、関数はそのキーを使用して新しい要素を挿入し、マップされた値への参照を返します。

ここで行ったことは、の値0をのキーに割り当てたことです。5

マップはキーと値によって機能します。それらがどのように動作するかを完全に理解しているようには見えません。通常、次のようなことを行います。

std::map<int, int> map;
map[5] = 1; // map now contains one element, with a key of 5 and a value of 1
std::cout << (map [5]); // Prints 1

-1この呼び出しでマップにを挿入しました:

glGetAttribLocation(program, attribute.c_str())

なぜなら、glGetAttribLocationベンジャミン前述したように、「指定された属性変数が指定されたプログラムオブジェクトのアクティブな属性でない場合、または名前が予約済みのプレフィックス'gl 'で始まる場合、値-1が返される」場合は-1を返します。 。次のようなことをする必要があります。

int res = glGetAttribLocation(program, attribute.c_str())
if(res == -1)
{
  // Throw an exception, log an error.. Handle this error somehow.
}
else
{
  // Otherwise store the valid result.
  attributeList[attribute] = res; 
}
于 2012-07-22T07:31:18.537 に答える
3

演算子は、指定されたキーには存在しない値を作成するため、[]常に何かを返します(そうでない場合は、キーの既存のマッピングを返します)。新しく作成された値は、データ型が何であれ、デフォルトのコンストラクターを使用します。テンプレートの引数によって異なります。明らかに、選択したデータ型はデフォルト値として-1を使用します。

編集:更新された質問に基づいて、glGetAttribLocation()-1を返す必要があり、その値はマップに表示されます。

于 2012-07-22T07:29:42.213 に答える