Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2013, 12:07   #1
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию проблема линкера "ссылка на неразрешенный внешний символ"

с добрым утром/etc.
имеется такая ситуация:

//formatlib.h
Код:
class skip{
	byte _size;
public:
	skip(const byte size);
	inline friend ostream &operator<<(ostream &os, const skip &skp);
};
//interface.cpp

Код:
...
cout << skip(5);
...
//formatlib.cpp

Код:
inline ostream &operator<<(ostream &os, const skip &skp){
	COORD cur = getCursor();
	setCursor(cur.X+skp._size, cur.Y);
	return os;
};
при компоновке получаю, "ссылка ..." по поводу inline ostream &operator<<(ostream &os, const skip &skp)
если поместить определение в formatlib.h то проблема решается, вот только я не хочу помещать определение в хедер.
как это можно исправить другим способом?

ПРИ ЭТОМ!!
конструктор определенный в formatlib.cpp он каким-то образом находит и не ругается
denrubun вне форума Ответить с цитированием
Старый 26.02.2013, 12:14   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

inline-метод должен быть определён в текущей единице трансляции (т.е. компилятор должен иметь доступ к коду метода при компиляции любого вызывающего этот метод фрагмента кода). Или включайте тело метода в заголовок, или переносите его в .h-файл, или откажитесь от встраивания.
Abstraction вне форума Ответить с цитированием
Старый 26.02.2013, 12:22   #3
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

спасибо, не знал такой тонкости)
denrubun вне форума Ответить с цитированием
Старый 26.02.2013, 12:41   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
спасибо, не знал такой тонкости)
А ведь это логично, если вдуматься. Встраивание - механизм замещения вызова функции её кодом. Соответственно, для него компилятор обязан знать, что там за код. А разделение на заголовочный файл и файл реализации служит ровно для обратного: чтобы в каждый момент времени компилятору нужно было "держать в уме" как можно меньше кода.
Abstraction вне форума Ответить с цитированием
Старый 26.02.2013, 14:12   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

кстати, хороший компилятор и без inline должен вместо вызова не слишком сложной процедуры сделать ее инлайн.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ссылка на неразрешенный внешний символ Axrik Общие вопросы C/C++ 4 01.12.2012 18:32
Ошибка: ссылка на неразрешенный внешний символ Cthutq66a Помощь студентам 7 06.11.2011 12:10
Ссылка на неразрешенный внешний символ Xenogig Общие вопросы C/C++ 4 07.05.2011 19:11
error LNK2019: ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup Zhivu igrayuchi Visual C++ 2 25.12.2010 16:48
Ссылка на неразрешенный внешний символ(error LNK2019) TheWanderer Общие вопросы C/C++ 2 07.08.2009 19:58