С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Пространства имен в Эклипс http://www.cyberforum.ru/cpp-beginners/thread635559.html
Добрый день. Переношу свой проект из IAR на Eclipse+Yagarto(gcc 4.6.2) Подскажите, из-за чего в hpp модулях проекта может не распознаваться тип namespase. Компилятор "говорит" "unknown type...
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++ Повторное открытие файла через классы
Добрый день. Пишу программу, которая должна уметь считывать файл, выполнять проверку, и, в случае ошибки, возвращаться в начало и предлагать откорректировать данные в файле. Написал, но при изменении...
C++ Использование функций excel в c++/c# (VisualStudio2010)
Всем привет. Нужно получить доступ к функциям excel из C#. Необходима функция "Подбор параметра". Может кто нибудь знает.... Нашел только как получить доступ к математическим функциям:...
C++ Triada http://www.cyberforum.ru/cpp-beginners/thread635456.html
метод сравнения триад (определить полный набор методов сравнения моментов времени) не могу понять самой сути задания, что от меня требуется. (необходимо сравнить отдельно часы минуты и секунды или...
C++ И где ошибка? Уже спасибо - разобрался сам. Модераторы, удалите пожалуйста эту тему. подробнее

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

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

10.08.2012, 11:18. Просмотров 764. Ответов 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 операторы приведения знаю, юзать новый стандарт возможности нет). Желательно ткнуть в пункт стандарта, описывающий это поведение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.