Форум программистов, компьютерный форум 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++ Triada http://www.cyberforum.ru/cpp-beginners/thread635456.html
метод сравнения триад (определить полный набор методов сравнения моментов времени) не могу понять самой сути задания, что от меня требуется. (необходимо сравнить отдельно часы минуты и секунды или например все переводить в секунды или как???) соответственно есть класс "Триада" (там переменные h,m,s) и "Время" связанные наследованием прошу помочь!
C++ И где ошибка? Уже спасибо - разобрался сам. Модераторы, удалите пожалуйста эту тему. подробнее

Показать сообщение отдельно
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3

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

10.08.2012, 11:18. Просмотров 739. Ответов 8
Метки (Все метки)

Была ситуация - объявлен класс - в нем оператор приведения к некому типу (указатель на функцию), оператор вывода в поток для этого класса определен в другом хедере. Если забыть подключить сей хедер - он выводил 0 или 1 в зависимости от возвращаемого значения оператором приведения (можно довольно сильно влететь не подключив файл).

Сейчас - объявлен класс - в нем оператор приведения к некому типу (указатель на функцию), прямого оператора вывода в поток для этого класса нет, есть класс для вывода, но это к теме не относится, объявленный аналогично в другом хедере, соответственно проблема остается.

А теперь вопрос.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
 
template<typename T>
class C
{
public:
   C():value(0)
   {
   }
   C(int v):value(v)
   {
   }
   typedef void (C::*unspecified_bool_type)();
private:
   void true_bool()
   {
   }
public:
   operator unspecified_bool_type()
   {
      return value ? &C::true_bool : 0;
   }
private:
   int value;
};
 
template<typename T>
std::ostream& operator << (std::ostream& os, typename C<T>::unspecified_bool_type);
 
int main()
{
   C<int> c;
   std::cout << c << std::endl;
   C<int> s(1);
   std::cout << s << std::endl;
}
Этот код работает. А хотелось бы получить undefined_reference.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
 
template<typename T>
class C
{
public:
   C():value(0)
   {
   }
   C(int v):value(v)
   {
   }
   typedef void (C::*unspecified_bool_type)();
private:
   void true_bool()
   {
   }
public:
   friend std::ostream& operator << (std::ostream& os, unspecified_bool_type);
   operator unspecified_bool_type()
   {
      return value ? &C::true_bool : 0;
   }
private:
   int value;
};
 
/*template<typename T>
std::ostream& operator << (std::ostream& os, typename C<T>::unspecified_bool_type);*/
 
int main()
{
   C<int> c;
   std::cout << c << std::endl;
   C<int> s(1);
   std::cout << s << std::endl;
}
Получаю undefined reference-ы как и надо, НО gcc сыплет ворнингами на тему

new.cpp:19:77: предупреждение: friend declaration «std::ostream& operator<<(std::ostream&, C<T>::unspecified_bool_type)» declares a non-template function [-Wnon-template-friend]
new.cpp:19:77: замечание: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
что не есть хорошо. Так же если объявить оператор вывода объявить свободным (но при этом указать просто C<T>) все тоже ок, получаю ошибки линковки как и хочу, но хотелось бы понять в чем конкретно проблема с первым случаем. (Про explicit операторы приведения знаю, юзать новый стандарт возможности нет). Желательно ткнуть в пункт стандарта, описывающий это поведение.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru