>
>
>
Непонятные ошибки при компиляции 64-бит…

Андрей Карпов
Статей: 671

Непонятные ошибки при компиляции 64-битной версии, error C2664

Иногда можно встретить вопросы об странных ошибках, выдаваемых компилятором при сборке 64-битного кода.

Вопрос может выглядеть следующим образом:

//Объявление класса
class Type1 {...};
class Type2 {...};
class A
{
  public:
  ...
  void Func1(Type1* t1.....);
  void Func1(Type2& t2.....);
  ...
};
//Использование функции Func1
A obj;
Type2 t2;
...
obj.Func1(t2,...);
...

Данный код успешно компилировался в 32-битном режиме, но при попытке собрать 64-битную версию компилятор выдает ошибку C2664 (не может привести Type2 к Type1*). Определена функция, которая принимает Type2& в качестве аргумента, но компилятор почему-то пытается подставить функцию, принимающую Type1* в качестве параметра. В чем может быть проблема?

Скорее всего, дело в других параметрах, которые в примере были заменены точками. Рассмотрим следующий код:

class Type1 {};
class Type2 {};
class A
{       
public:
void Func1(Type1* t1, unsigned &);
void Func1(Type2& t2, size_t &);
};
void use() {
  A obj;
  Type2 t2;
  unsigned u;
  obj.Func1(t2, u);
}

Он успешно компилируется в 32-битном режиме. Но в 64-битном обе функции не подходят. Компилятор принимает решение, что первая функция является лучшим кандидатом, так как у нее точно совпадает второй параметр. И сообщает, что не подходит первый аргумент: error C2664: 'void A::Func1(Type1 *,unsigned int &)' : cannot convert parameter 1 from 'Type2' to 'Type1 *'. Решение - внимательно изучить остальные аргументы и внести в код необходимые изменния.