Глючит перегрузка функции
// 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++ иногда
// забывает таблицу виртуальных методов, поэтому не подходит
// Короче, проблема большая... :-)))
// Кто-нибудь с ней сталкивался уже? :)
// Как-то раз я наткнулся на интересный глюк в компиляторах
// 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 билдер. Попробовал. Все пучком, два метода живут нормально.
У меня 6 билдер. Попробовал. Все пучком, два метода живут нормально.
У меня C++ Builder Enterprise Suite Version 6.0
(Build 10.157)
Может быть у вас какие-нибудь настройки компилятора крутые стоят? Я просто попробовал скомпилить эту программу сразу после установки Borland C++ Builder... :(
У меня C++ Builder Enterprise Suite Version 6.0
(Build 10.157)
Может быть у вас какие-нибудь настройки компилятора крутые стоят? Я просто попробовал скомпилить эту программу сразу после установки Borland C++ Builder... :(
Нет установки обычные. И если компилятор выдает could not math .... это значит, что он не нашел метод с такими параметрами. Скорее всего у Вас наведенная синтаксическая ошибка, а когда Вы примерчик в топик кидали, то написали без ошибок. Вот у меня все и проехало. Посмотрите текст повнимательней.
Нет установки обычные. И если компилятор выдает could not math .... это значит, что он не нашел метод с такими параметрами. Скорее всего у Вас наведенная синтаксическая ошибка, а когда Вы примерчик в топик кидали, то написали без ошибок. Вот у меня все и проехало. Посмотрите текст повнимательней.
На самом деле, я сначала написал примерчик в Buildere, попробовал его, а потом целиком скопировал в Форум. А какая версия среды у вас? (Это чтоб я и себе такую поставил) :)
На самом деле, я сначала написал примерчик в Buildere, попробовал его, а потом целиком скопировал в Форум.
Ну тогда еще один способ:
t.DoSomeShit((CTest&)CTest(1));
Ну тогда еще один способ:
t.DoSomeShit((CTest&)CTest(1));
Спасибо большое, этот способ впослне подходит, только
мне теперь придется повозиться - у нас около 3000 мест в
коде, где нужно будет кое-что подправить :-) Но всеравно это сделать значительно проще, чем рыться дальше. А я уже перепробовал 5 разных компиляторов для винды
Спасибо большое, этот способ впослне подходит, только
мне теперь придется повозиться - у нас около 3000 мест в
коде, где нужно будет кое-что подправить :-) Но всеравно это сделать значительно проще, чем рыться дальше. А я уже перепробовал 5 разных компиляторов для винды
Сочуствую.