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

Шаблоны классов, перегрузка operator<< класса ostream - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Точки на плоскости. http://www.cyberforum.ru/cpp-beginners/thread448450.html
Заданы три точки на плоскости: M с координатами (x1,y1), L с координатами (x2,y2) и H с координатами (x3,y3). Определите, лежат ли они на одной прямой. При отрицательном ответе найти площадь и периметр треугольника MLH.
C++ Векторы! Введите вектор и найдите его норму: сумму абсолютных величин координат. Что значит сумму абсолютных величин координат. объясните сам ход решения http://www.cyberforum.ru/cpp-beginners/thread448433.html
C++ структура
почему компилятор не одобряет такую запись cout<<"Координаты суммарной точки равны - x "<<p3.x=p2.x+p1.x; cout<< "y" <<p3.y=p2.y+p1.y; говорит что "=" не определен, вроде = не определен для p3=p2+p1; и при следующей записи проблем не выдает p3.x=p2.x+p1.x; p3.y=p2.y+p1.y; cout<<"Координаты суммарной точки равны - x ("<<p3.x<<") y ("<<p3.y<<")";
Длина вектора C++
Я написал код для нахождения длины вектора проблема в том что она не выводит мне числа после запятой в чём проблема в задание написано использовать тип float #include <cstdlib> #include <iostream> #include <math.h> #define n 3 using namespace std; int main()
C++ название библиотеки http://www.cyberforum.ru/cpp-beginners/thread448392.html
как называется библиотека в которой описана функция D3DXCreateTeapot ? Добавлено через 4 минуты #include <windows.h> #include <d3d9.h> #include <d3dx9mesh.h>
C++ Конструктор копирования Может быть глупый вопрос, а может я глупый... Конструктор копирования имеет такой синтаксис имякласса(const имякласса &){ тело конструктора } Почему параметр передается по ссылке? подробнее

Показать сообщение отдельно
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
19.02.2012, 16:01  [ТС]     Шаблоны классов, перегрузка operator<< класса ostream
Ваша подсказка натолкнула мнея на следующее:
В моем первоначальном варианте кода ошибку давал не компилятор, а компоновщик.
Причина - отсутствие необходимого инстанцирования шабона функции operator<<.
Ваше решение:

friend ostream &operator<< <T>(ostream &os, const A<T> &a);

явно указать компилятору использовать шаблон функции ( <T> ).
Это работает. Огромное спасибо.

Почему тогда НЕ работает мой первоначальный вариант с добавлением перед main()
директивы явного инстанцирования шаблона:

template ostream &operator<< <int>(ostream &os, const A<int> &a);

т.е. вот так:
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
#include <iostream>
using namespace std;
 
template <typename T>
class A
{
    T t;
public:
    A(T x): t(x) {}
    friend ostream &operator<< (ostream &os, const A<T> &a);
};
template <typename T>
ostream &operator<<(ostream &os, const A<T>& a)
{
    os << a.t;
    return os;
}
// Явное инстанцирование шаблона
template ostream &operator<< <int>(ostream &os, const A<int> &a);
 
int main()
{
    A<int> a(7);
    cout << a << endl;
}
 
Текущее время: 22:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru