Я использую для этого версии Visual Studio 2005 и 2012, приведенный ниже код компилируется, и в vs2005 проблем нет, но в vs2012 возникает ошибка. Я перегнал код, над которым я работал, до приведенного ниже примера, который компилируется и запускается (в vs2005)
#include <map>
//Arbitrary class
class SimpleClass
{
private:
int member;
public:
explicit SimpleClass( int i ) : member(i) {}
operator int() const { return member;}
};
//In code I have a map with these types and make_pair is invoked
//when an insert occurs into that map
typedef std::pair<SimpleClass,SimpleClass> SCPair;
//simple fn to replace myMap.insert(...)
void lvalref_test( const SCPair& sp )
{
return;
}
int main( unsigned int argc, const char** argv )
{
const int anInt = 2;
//make_pair creates a pair<SimpleClass,SimpleClass> from
//the instance of pair<int,SimpleClass> in the normal way
//and Because SimpleClass is constructable from an int,
//the creation succeeds (In vs2005)
lvalref_test( std::make_pair( anInt, SimpleClass(1) ) );
return 0;
}
vs2012 дает мне:
ошибка C2664: 'lvalref_test': невозможно преобразовать параметр 1 из 'std::pair‹_Ty1,_Ty2>' в 'const SCPair &'
Я рассмотрел разницу между реализациями std::pair в обоих
по сравнению с 2005 годом
template<class _Other1,
class _Other2>
pair(const pair<_Other1, _Other2>& _Right)
: first(_Right.first), second(_Right.second)
{ // construct from compatible pair
}
по сравнению с 2012 годом
template<class _Other1,
class _Other2>
pair(const pair<_Other1, _Other2>& _Right,
typename enable_if<is_convertible<const _Other1&, _Ty1>::value
&& is_convertible<const _Other2&, _Ty2>::value,
void>::type ** = 0)
: first(_Right.first), second(_Right.second)
{ // construct from compatible pair
}
Я предполагаю, что enable_if
вызывает изменение поведения, но я не совсем уверен, почему.
Я знаю, как исправить ошибку, которую я вижу, я могу пройти через экземпляр SimpleClass, и все в порядке. Мой вопрос здесь: должен ли он по-прежнему выводить правильные параметры шаблона и создавать правильный тип пары? Изменилось ли это поведение или я где-то ошибся?
Ответ: да, я сделал ошибку - я проигнорировал очевидное ключевое слово explicit
и с головой погрузился в механизм....