У меня есть код, который включает в себя итерацию через std::hash_set
что-то вроде этого:
typedef std::hash_set< VEdge, VEdge > MyHashSet;
MyHashSet hs;
for( int i=0; i < numFaces; ++i )
{
VEdge myEdge( someValue, someOtherValue );
MyHashSet::iterator it = hs.find(myEdge);
if ( it->face[0] == -1 )
it->face[0] = i; // Error: "Read-only variable is not assignable"}
Я изменил код, чтобы упростить его, но вы можете увидеть, что он делает. VEdge
определяется в структуре, которая имеет int face[2]
как один из его членов. У меня проблема в том, что Clang говорит мне, что it->face[0]
только для чтения, хотя этот же код работает на MSVC (или мне так сказали). Есть ли что-то в Clang, что означает, что я должен определить face
переменная как-то для записи?
hash_set
класс нестандартный. Версия Microsoft позволяет изменять содержимое объекта с помощью iterator
, но версия SGI, которая, как я предполагаю, вы используете с Clang, имеет iterator
а также const_iterator
как тот же тип, что означает, что вы не можете изменить содержимое контейнера с помощью итераторов.
Это также хорошо, поскольку позиции объектов в контейнере определяются их хэшами, а их хэш — их значениями. Изменение их значений потребовало бы изменения их позиций, но хэш-набор не может определить, что вы меняете их значения, поэтому контейнер будет несовместимым. (Возможно, элементы, которые вы изменяете, на самом деле не влияют на хэш, но для hash_set
знать это. Версия Microsoft, вероятно, оставляет поведение неопределенным, если вы изменяете содержимое, тогда как SGI полностью запрещает эту операцию.)
Других решений пока нет …