c ++ value_type не работает для std :: tr1: tuple в std :: map

Следующий фрагмент кода работает с Visual Studio 2008, но не с Visual Studio 2010.

template <typename TKey>
struct MyStruct
{
    typedef std::map<TKey, int>  Keys;

    MyStruct()
    {
    }

    void set(TKey& key)
    {
#if 1
        // This works with VS 2008 but not with 2010
        keys_.insert(typename Keys::value_type(key, 1));
#else
        // This works with VS 2008 and VS 2010
        keys_.insert(std::pair<TKey, int>(key, 1));
#endif
    };

private:
    Keys keys_;
};

использование

typedef std::tr1::tuple<int, int> MyValueType;
MyStruct<MyValueType> a;
MyValueType x;
a.set(x);

Я получаю следующую ошибку:

Если заменить typedef std :: tr1 :: tuple MyValueType на typedef int MyValueType, это сработает.

Заранее спасибо.

Я думаю, что это ошибка, связанная с плохой реализацией семантики перемещения в MSVC 2010, поскольку вы можете успешно скомпилировать этот код:


person mar.na    schedule 22.10.2012    source источник
comment
Обычно для таких вставок я использую typename. Это всегда должно работать.   -  person Praetorian    schedule 22.10.2012
comment
О да, я забыл название типа. Я извлек MyStruct из сторонней библиотеки, которую использовал в своем проекте. Там есть имя типа. Поэтому я исправляю пример выше.   -  person Olaf Dietsche    schedule 23.10.2012
comment
Проблема заключается в том, что _1_ является _2_, и кажется, что реализация _3_ в MSVC неправильно переходит от _4_ квалифицированных участников.   -  person mar.na    schedule 23.10.2012
comment
Спасибо за быстрые ответы. Есть ли другой способ скомпилировать код без изменения MyStruct. Потому что я извлек MyStruct из сторонней библиотеки (Poco), которую использовал в своем проекте.   -  person Xeo    schedule 23.10.2012


Ответы (1)


Кажется, это ошибка компилятора, он компилируется на gcc. Вам не хватает

typename Keys::value_type v( key, 1 );
keys_.insert(v);
перед _2_ (поскольку _3_ зависит от _4_); но добавление этого тоже не исправляет ошибку.

typename Keys::value_type v( key, 1 );
keys_.insert(v);
person BigBoss    schedule 22.10.2012
comment
1> C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ tuple (127): ошибка C2440: 'инициализация': невозможно преобразовать из 'const MyValueType' в 'int' 1> Оператор пользовательского преобразования недоступен который может выполнить это преобразование, или оператор не может быть вызван 1> C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ xxtuple0 (9): см. ссылку на создание экземпляра шаблона функции 'std :: tr1 :: _ Cons_node ‹_Car , _Cdr> :: _ Cons_node ‹_Ty, std :: tr1 :: _ Nil &, std :: tr1 :: _ Nil &, std :: tr1 :: _ Nil &, std :: tr1 :: _ Nil &, std :: tr1 :: _ Nil &, std :: tr1 :: _ Nil &, std :: tr1 :: _ Nil &, std :: tr1 :: _ Nil &, std :: tr1 :: _ Nil &> (_ Farg0 &&, _ Farg1, _Farg2, _Farg3, _Farg4, _Farg5, _Farg6, _Farg7, _Farg8 , _Farg9) 'компилируется 1> с 1> [1>
_Car = int, 1> _Cdr = std :: tr1 :: _ Cons_node :: _ Type>, 1> _Ty = MyValueType, 1> _Farg0 = MyValueType, 1 > _Farg1 = std :: tr1 :: _ Nil &, 1>
_Farg2 = std :: tr1 :: _ Nil &, 1> _Farg3 = std :: tr1 :: _ Nil &, 1> _Farg4 = std :: tr1 :: _ Nil &, 1> _Farg5 = std :: tr1 :: _ Nil &, 1> _Farg6 = std :: tr1 :: _ Nil &, 1> _Farg7 = std :: tr1 :: _ Nil &, 1> _Farg8 = std :: tr1 :: _ Nil &, 1> _Farg9 = std :: tr1 :: _ Nil & 1>] 1> C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ utility (145): см. ссылку на создание экземпляра шаблона функции 'std :: tr1 :: tuple ‹_Arg0, _Arg1> :: tuple> (_ Farg0 &&)', который компилируется 1>
с 1> [1> _Arg0 = int, 1>
_Arg1 = int, 1> _Farg0 = const std :: tr1 :: tuple 1>] 1> C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ utility (142): при компиляции функции-члена шаблона класса 'std: : _Pair_base ‹_Ty1, _Ty2> :: _ Pair_base (const std :: tr1 :: tuple‹ _Arg0, _Arg1> &&, int &&) '1> с 1>
[1> _Ty1 = const MyValueType, 1> _Ty2 = int, 1> _Arg0 = int, 1> _Arg1 = int 1>] 1> C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ utility (174): см. Ссылку на создание экземпляра шаблона класса 'std :: _ Pair_base ‹_Ty1, _Ty2>', компилируемого 1> с 1>
[1> _Ty1 = const MyValueType, 1> _Ty2 = int 1>] 1>
D: \ Projekte \ demo \ Demo.cpp (40): см. ссылку на создание экземпляра шаблона класса 'std :: pair ‹_Ty1, _Ty2>', компилируемого 1> с 1> [1 >
_Ty1 = const MyValueType, 1> _Ty2 = int 1>] 1> D: \ Projekte \ demo \ Demo.cpp (39): при компиляции функции-члена шаблона класса 'void MyStruct :: set (TKey &)' 1> с 1> [1>
TKey = MyValueType 1>] 1>
D: \ Projekte \ demo \ Demo.cpp (92): см. Ссылку на создание экземпляра шаблона класса 'MyStruct', компилируемого 1> с 1> [1>
TKey = MyValueType 1>] 1> C: \ Program Files \ Microsoft Visual Studio 10. 0 \ VC \ include \ tuple (127): ошибка C2439: 'std :: tr1 :: _ Cons_node ‹_Car, _Cdr> :: _ Value': член не может быть инициализирован 1> с 1> [1> _Car = int, 1 >
_Cdr = std :: tr1 :: _ Cons_node :: _ Type> 1>] 1> C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ tuple (170): см. объявление 'std :: tr1 :: _ Cons_node ‹_Car, _Cdr> :: _ Value '1> с 1>
[1> _Car = int, 1>
_Cdr = std :: tr1 :: _ Cons_node :: _ Type> 1>] == ======== Сборка: 0 успешных, 1 неудачных, 0 актуальных, 0 пропущенных ========== - person mar.na; 23.10.2012