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

Ошибка линкера - C++

Восстановить пароль Регистрация
 
DartLenin
35 / 35 / 2
Регистрация: 24.05.2009
Сообщений: 178
06.01.2012, 16:39     Ошибка линкера #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <fstream>
using namespace std;
template <class T>
class A
{
    T i;
public:
    friend ofstream& operator<<(ofstream& str,A<T>& a);
};
template <class T>
ofstream& operator<<(ofstream& str,A<T>& a)
{
    str<<a.i;
    return str;
}
void main()
{
    A<int> a;
    ofstream out("output.txt");
    out<<a;
}
Выдает такую ошибку:
1>Main.obj : error LNK2019: unresolved external symbol "class std::basic_ofstream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ofstream<char,struct std::char_traits<char> > &,class A<int> &)" (??6@YAAAV?$basic_ofstream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$A@H@@@Z) referenced in function _main
Если перенести определение дружественной функции в тело класса, то все ок. Почему так? Я что то пишу не так или так вообще нельзя?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
06.01.2012, 16:44     Ошибка линкера #2
namespace
DartLenin
35 / 35 / 2
Регистрация: 24.05.2009
Сообщений: 178
06.01.2012, 22:16  [ТС]     Ошибка линкера #3
Цитата Сообщение от NoMasters Посмотреть сообщение
namespace
Не понял Что не так с namespace?
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
06.01.2012, 22:28     Ошибка линкера #4
Извиняюсь. Ему не нравится, что дружественная функция описывается вне того же шаблона.

Добавлено через 45 секунд
У g++ куда более адекватный вывод:
vel.c:8:51: предупреждение: friend declaration «std::ofstream& operator<<(std::ofstream&, A<T>&)» declares a non-template function [-Wnon-template-friend]
vel.c:8:51: замечание: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
vel.c:16:11: ошибка: «::main» должна возвращать «int»
Yandex
Объявления
06.01.2012, 22:28     Ошибка линкера
Ответ Создать тему
Опции темы

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