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