Форум программистов, компьютерный форум CyberForum.ru

Как получить undefined reference вместо вывода? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Пространства имен в Эклипс http://www.cyberforum.ru/cpp-beginners/thread635559.html
Добрый день. Переношу свой проект из IAR на Eclipse+Yagarto(gcc 4.6.2) Подскажите, из-за чего в hpp модулях проекта может не распознаваться тип namespase. Компилятор "говорит" "unknown type name 'namespase' ". В cpp файле обьявление областей переменных проглатывает, а в hpp при обьявлении класса внутри namespase выдает ошибки Пример namespace nm_dInput { class CdInput
C++ Получение предыдущего объекта из списка (std::list) #include <Iostream> int main() { std::list<COORD*> coords; COORD* pCoord; for(uint16 i = 0; i < 10; ++i) { http://www.cyberforum.ru/cpp-beginners/thread635548.html
C++ Повторное открытие файла через классы
Добрый день. Пишу программу, которая должна уметь считывать файл, выполнять проверку, и, в случае ошибки, возвращаться в начало и предлагать откорректировать данные в файле. Написал, но при изменении данных, к примеру с числа 5 на 20, программа все равно оперирует старыми данными, то есть числом 5. Это заголовочный файл: #include<iostream> #include<fstream> #include<vector> using...
C++ Использование функций excel в c++/c# (VisualStudio2010)
Всем привет. Нужно получить доступ к функциям excel из C#. Необходима функция "Подбор параметра". Может кто нибудь знает.... Нашел только как получить доступ к математическим функциям: Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.WorksheetFunction wsf = xl.WorksheetFunction; textBox1.Text =...
C++/CLI WinForms Доступ к компонентам http://www.cyberforum.ru/cpp-beginners/thread635467.html
как в любой из последних четырёх функций получить доступ к элементам формы и к самой форме?? namespace mail_spam_admin { void cipher(char * str,char * str_cipher , char* cipher); void de_cipher(char * str,char * str_cipher , char* cipher); DWORD WINAPI ThreadWorkClient(StructurClientData &data); DWORD WINAPI ThreadNetworkAdminSystem(StructurNetworkAdminData &data);
C++ Triada метод сравнения триад (определить полный набор методов сравнения моментов времени) не могу понять самой сути задания, что от меня требуется. (необходимо сравнить отдельно часы минуты и секунды или например все переводить в секунды или как???) соответственно есть класс "Триада" (там переменные h,m,s) и "Время" связанные наследованием прошу помочь! подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
10.08.2012, 13:38     Как получить undefined reference вместо вывода?
Ну пока я вижу, что он вообще не трогает эту функцию, а почему-то берёт какую-то дефолтную. Потому, естессно, никаких undefined reference на неиспользуемую несуществующую функцию. Посмотрев ещё на это и немного потыкав это всё в отладчике, он почему-то делает неявный каст к unspecified_bool_type, который void (*)(), а потом почему-то... приводит его к bool O_O

Ниччё не понимаю... Ну ладно первый каст. Но второй-то почему? Ну ладно, не нашёл функцию с void (*)(), значит приводим дальше. Но почему тогда к bool, а не int?

*яростно листает 13 главу про перегрузку*

Объяснить ругань в случае (с friend std::ostream& operator << (std::ostream& os, unspecified_bool_type);) ещё можно: C<int>::unspecified_bool_type и C<float>::unspecified_bool_type — это разные типы; так как объявление использует unspecified_bool_type из объявляемого класса C<T>, то он влепил спецификатор C<T>::; но сама функция-друг не объявлена шаблонной (функции-друзья же не являются методами классов), потому не имеет права использовать шаблонный тип T.

Добавлено через 46 минут
(Ссылки привожу по этой версии.)

Пример из 13.3.1.2/6
C++
1
2
3
4
5
6
7
8
struct A {
    operator int ();
};
A operator +( const A & , const A &);
void m () {
    A a , b ;
    a + b ; / / operator+(a,b) chosen over int(a) + int(b)
}
очень похож на эту проблему. Топаем на ссылаемый 13.3.3, где описывается способ выбора цепочки неявных преобразований типов при выборе перегруженного варианта функции.

Итого, у компилятора, когда он видит запись std::cout << c;, то, так как никакого
std::ostream& operator<<(std::ostream&, С<T>);
нет, то возникает выбор между пачкой неявных преобразований:
std::ostream& operator<<(std::ostream&, int);
std::ostream& operator<<(std::ostream&, bool);
std::ostream& operator<<(std::ostream&, С<T>::unspecified_bool_type);
и т. д.

В 13.3.3, 13.3.3.2 ногу свернуть можно.
Но, по видимому, он не считает преобразование к С<T>::unspecified_bool_type достаточным, потому как метод не определён, поэтому продолжает искать другие цепочки, чтобы выбрать какую-нибудь другую альтернативную перегрузку. И находит цепочку C<T> → С<T>::unspecified_bool_type ≡ void (*)() → bool. Последнее это стандартное правило из 4.12: указатель можно кастовать к bool. (И, естессно, так как неопределённый метод при такой цепочке преобразований не используется, то линковщик на него и не ругается.)

По-видимому, где-то так.

Не по теме:

В такие моменты прям отлично понимаешь, насколько C++ всё же монстр и сколько времени уходит на разработку его компиляторов.

 
Текущее время: 20:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru