Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Глючит перегрузка функции

2.9K
17 февраля 2005 года
pushkin
43 / / 13.09.2004
// Как-то раз я наткнулся на интересный глюк в компиляторах
// Borland C++ Builder 5.x и 6.x. При попытке скомпилить
// следующий код, компилятор генерирует ошибку: Could not
// find a match for 'CTest::DoSomeShit(CTest)'.

#include <stdio.h>

// Наш тестовый класс
class CTest
{
public:
CTest(int i) {} // Конструктор с параметром

// Две перегруженные (казалось бы) функции
// Если вторую закоментировать, то все работает :-)
void DoSomeShit(CTest &test_in);
void DoSomeShit(char *s);
};

// Фукнция, в которую я хочу передать ссылку на экземпляр
// этого же класса
void CTest :: DoSomeShit(CTest &test_in)
{
printf("Some Shit\n");
}

void main()
{
CTest t(0);
t.DoSomeShit(CTest(0));
}

// Чтоб это проверить, нужно создать консольное приложение и // скопировать туда этот код.
// А теперь интересное: если закоментировать в определении
// класса CTest функцию void DoSomeShit(char *s), то
// программа компилируется нормально: как и предполагается
// в строке t.DoSomeShit(CTest(0)) из функции main()
// создается локальная переменная с областью существования
// на всю функцию main(), и в функцию DoSomeShit(CTest &)
// передается ссылка на эту переменную. Не понятно, почему
// компилятор не может сделать тоже самое, если в классе
// CTest будет две функции с таким именем (пусть даже с
// разным количеством параметров). Эта ситуация легко
// обходится, если написать так:

/*
void main()
{
CTest t(0);
CTest t2(1); // Сами создадим локальную переменную
t.DoSomeShit(t2); // И передадим ссылку на нее
}
*/

// При всем при этом это нормально компилируется в Visual
// C++ (6.0, .NET, 2005), в g++ (из Linux), Borland C++ 3.x // но не компилируется в Borland C++ Builder'e.
// Мне просто необходимо скомпилировать что-то подобное
// в Borland C++ Builder'e. Дело в том, что у нас есть
// куча старых исходников (от Borland C++ 3.x), которые
// надо перекомпилировать под винду, а Visual C++ иногда
// забывает таблицу виртуальных методов, поэтому не подходит
// Короче, проблема большая... :-)))
// Кто-нибудь с ней сталкивался уже? :)
259
17 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by pushkin
// Как-то раз я наткнулся на интересный глюк в компиляторах
// Borland C++ Builder 5.x и 6.x. При попытке скомпилить
// следующий код, компилятор генерирует ошибку: Could not
// find a match for 'CTest::DoSomeShit(CTest)'.

#include <stdio.h>

// Наш тестовый класс
class CTest
{
public:
CTest(int i) {} // Конструктор с параметром

// Две перегруженные (казалось бы) функции
// Если вторую закоментировать, то все работает :-)
void DoSomeShit(CTest &test_in);
void DoSomeShit(char *s);
};

// Фукнция, в которую я хочу передать ссылку на экземпляр
// этого же класса
void CTest :: DoSomeShit(CTest &test_in)
{
printf("Some Shit\n");
}

void main()
{
CTest t(0);
t.DoSomeShit(CTest(0));
}

// Чтоб это проверить, нужно создать консольное приложение и // скопировать туда этот код.
// А теперь интересное: если закоментировать в определении
// класса CTest функцию void DoSomeShit(char *s), то
// программа компилируется нормально: как и предполагается
// в строке t.DoSomeShit(CTest(0)) из функции main()
// создается локальная переменная с областью существования
// на всю функцию main(), и в функцию DoSomeShit(CTest &)
// передается ссылка на эту переменную. Не понятно, почему
// компилятор не может сделать тоже самое, если в классе
// CTest будет две функции с таким именем (пусть даже с
// разным количеством параметров). Эта ситуация легко
// обходится, если написать так:

/*
void main()
{
CTest t(0);
CTest t2(1); // Сами создадим локальную переменную
t.DoSomeShit(t2); // И передадим ссылку на нее
}
*/

// При всем при этом это нормально компилируется в Visual
// C++ (6.0, .NET, 2005), в g++ (из Linux), Borland C++ 3.x // но не компилируется в Borland C++ Builder'e.
// Мне просто необходимо скомпилировать что-то подобное
// в Borland C++ Builder'e. Дело в том, что у нас есть
// куча старых исходников (от Borland C++ 3.x), которые
// надо перекомпилировать под винду, а Visual C++ иногда
// забывает таблицу виртуальных методов, поэтому не подходит
// Короче, проблема большая... :-)))
// Кто-нибудь с ней сталкивался уже? :)


У меня 6 билдер. Попробовал. Все пучком, два метода живут нормально.

2.9K
17 февраля 2005 года
pushkin
43 / / 13.09.2004
Цитата:
Originally posted by AlexandrVSmirno

У меня 6 билдер. Попробовал. Все пучком, два метода живут нормально.



У меня C++ Builder Enterprise Suite Version 6.0
(Build 10.157)

Может быть у вас какие-нибудь настройки компилятора крутые стоят? Я просто попробовал скомпилить эту программу сразу после установки Borland C++ Builder... :(

259
17 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by pushkin


У меня C++ Builder Enterprise Suite Version 6.0
(Build 10.157)

Может быть у вас какие-нибудь настройки компилятора крутые стоят? Я просто попробовал скомпилить эту программу сразу после установки Borland C++ Builder... :(


Нет установки обычные. И если компилятор выдает could not math .... это значит, что он не нашел метод с такими параметрами. Скорее всего у Вас наведенная синтаксическая ошибка, а когда Вы примерчик в топик кидали, то написали без ошибок. Вот у меня все и проехало. Посмотрите текст повнимательней.

2.9K
17 февраля 2005 года
pushkin
43 / / 13.09.2004
Цитата:
Originally posted by AlexandrVSmirno

Нет установки обычные. И если компилятор выдает could not math .... это значит, что он не нашел метод с такими параметрами. Скорее всего у Вас наведенная синтаксическая ошибка, а когда Вы примерчик в топик кидали, то написали без ошибок. Вот у меня все и проехало. Посмотрите текст повнимательней.



На самом деле, я сначала написал примерчик в Buildere, попробовал его, а потом целиком скопировал в Форум. А какая версия среды у вас? (Это чтоб я и себе такую поставил) :)

259
17 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by pushkin


На самом деле, я сначала написал примерчик в Buildere, попробовал его, а потом целиком скопировал в Форум.


Ну тогда еще один способ:
t.DoSomeShit((CTest&)CTest(1));

2.9K
17 февраля 2005 года
pushkin
43 / / 13.09.2004
Цитата:
Originally posted by AlexandrVSmirno

Ну тогда еще один способ:
t.DoSomeShit((CTest&)CTest(1));


Спасибо большое, этот способ впослне подходит, только
мне теперь придется повозиться - у нас около 3000 мест в
коде, где нужно будет кое-что подправить :-) Но всеравно это сделать значительно проще, чем рыться дальше. А я уже перепробовал 5 разных компиляторов для винды

259
17 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by pushkin

Спасибо большое, этот способ впослне подходит, только
мне теперь придется повозиться - у нас около 3000 мест в
коде, где нужно будет кое-что подправить :-) Но всеравно это сделать значительно проще, чем рыться дальше. А я уже перепробовал 5 разных компиляторов для винды


Сочуствую.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог