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

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

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

```cpp
//Объявление класса
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\* в качестве параметра\. В чем может быть проблема?

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

```cpp
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 \*'\. Решение \- внимательно изучить остальные аргументы и внести в код необходимые изменния\.