LINUX.ORG.RU

[c++]друзья шаблонов

 


0

0

Народ, подскажите пожалуйста как сделать чтобы компилировалось это. Точнее не это, а как объявить друга шаблона-класса?

namespace Scalar{
template<class S> 
class CScalar
{
	S val;
public:
	friend CScalar& Add<>(CScalar& a,CScalar& b);
	CScalar& operator=(const CScalar& v) {return val=v.val;}
	CScalar(const CScalar& s){val = s.val;}
	CScalar(const S& s){val = s;}
	CScalar(void){val = 0;};
	~CScalar(void){};
};
template<class S>
 CScalar<S>& Add(CScalar<S>& a,CScalar<S>& b){}
};


Ответ на: комментарий от dilmah

Все равно ошибки вылезают. Вот код полностью

namespace Scalar{
template<class S>
 CScalar<S>& Add(CScalar<S>& a,CScalar<S>& b);
template<class S> 
class CScalar
{
	S val;
public:
	template<class S> friend CScalar<S>& Add(CScalar<S>& a,CScalar<S>& b); 
	CScalar& operator=(const CScalar& v) {return val=v.val;}
	CScalar(const CScalar& s){val = s.val;}
	CScalar(const S& s){val = s;}
	CScalar(void){val = 0;};
	~CScalar(void){};
};
};
Вот что за ошибки
Error	7	fatal error C1075: end of file found before the left brace '{' at 'd:\program files\microsoft visual studio 9.0\vc\include\stdlib.h(35)' was matched	d:\program files\microsoft visual studio 9.0\vc\include\stdlib.h	82
Error	2	error C4430: missing type specifier - int assumed. Note: C++ does not support default-int	d:\projects\libsig\libsig\scalar.h	5
Error	9	error C4430: missing type specifier - int assumed. Note: C++ does not support default-int	d:\projects\libsig\libsig\scalar.h	5
Error	3	error C2988: unrecognizable template declaration/definition	d:\projects\libsig\libsig\scalar.h	5
Error	10	error C2988: unrecognizable template declaration/definition	d:\projects\libsig\libsig\scalar.h	5
Error	5	error C2143: syntax error : missing ';' before 'identifier'	d:\program files\microsoft visual studio 9.0\vc\include\stdlib.h	82
Error	1	error C2143: syntax error : missing ';' before '<'	d:\projects\libsig\libsig\scalar.h	5
Error	8	error C2143: syntax error : missing ';' before '<'	d:\projects\libsig\libsig\scalar.h	5
Error	4	error C2059: syntax error : '<'	d:\projects\libsig\libsig\scalar.h	5
Error	11	error C2059: syntax error : '<'	d:\projects\libsig\libsig\scalar.h	5

jeep
() автор топика
Ответ на: комментарий от jeep
template<class S>  
class CScalar 
{ 
   S val; 
public: 
   template<class T> friend CScalar<T>& Add(CScalar<T>& a,CScalar<T>& b);  
   CScalar& operator=(const CScalar& v) {return val=v.val;} 
   CScalar(const CScalar& s){val = s.val;} 
   CScalar(const S& s){val = s;} 
   CScalar(void){val = 0;}; 
   ~CScalar(void){}; 
}; 
anonymous
()

друзьям доверяют больше, чем потомкам да.

А зачем вообще в си++ всякие protected, private и прочее, чтобы жизнь мёдом не казалась?

dimon555 ★★★★★
()
Ответ на: комментарий от anonymous

кстати, действительно, почему просто не сделать static функцию-член?

Error 11 error C2059: syntax error : '<' d:\projects\libsig\libsig\scalar.h 5

да Вы, батенька, водочкой балуетесь^W^Wвендузятнег

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

>вендузятник да ещё с Visual Studio. зачем на лор лезть с такой ориентацией?

Давайте без экстремизма.

А по сабжу — цпп такой цпп =) без водки не разберешься.

mityaz
()
Ответ на: комментарий от dilmah

А мне если чесно пофигу - линукс, сфиндофс или ос ХХХ или еще какая. У меня работает и мне хорошо. Сейчас жду 10.04 кубунду. А виндовс неплохая ос для своих целей. Я вот пользуюсь уже года 2 и горя не знаю. На др диске кубунта, но после покупки asus xonar d2 и не возможности человечески и без олеап настроить алсу для карточки и использовать полноценно оборудование - временно отложил кубунту до лучших времен. Но все что выше оффтопик.

jeep
() автор топика
Ответ на: комментарий от anonymous

А я вообще верующий человек. Но не хочется особенно сильно филосовствовать по вопросам линукс вс мсофт. Моя идея такая, что это вообще ос для разных целей созданы были. Попытка сделать линукс-десктопом хорошая конечно-но что-то еще не очень получается у нас. А все разговоры про, то что там все можно это у вас руки кривые - это ересь. Короче пацаны не напрягайте пожалуйста этой религией - голова и так пухнет.

jeep
() автор топика
Ответ на: комментарий от jeep

Шо-то я не понял.

template<class S> class CScalar { 
  S val; 
public: 
  template<class T> friend CScalar<T>& Add(CScalar<T>& a,CScalar<T>& b);  
  CScalar& operator=(const CScalar& v) {return val=v.val;} 
  CScalar(const CScalar& s){val = s.val;} 
  CScalar(const S& s){val = s;} 
  CScalar(void){val = 0;}; 
  ~CScalar(void){}; 
}; 
template<class S> CScalar<S>& Add(CScalar<S>& a,CScalar<S>& b); 
отлично компилится в gcc.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Спасибо всем. Я разобрался в вопросе по поводу шаблонов. Чтобы облегчить другим людям жизнь я отсылаю всех кто попадет на эту страничку к Дж. Саттеру «Новые сложные задачи на С/С++» тема называется «Друзья и шаблоны». В общем-то все дело в реализацияк компиляторов. Чувак пишет, чтобы класс с френдами компилировался на большем числе компиляторов нужно писать так:

 friend template<class T> CScalar<T>& Add<>(CScalar<T>& a,CScalar<T>& b);   
Нужно обратить внимание на угловые скобки после имени функции. Компилятор у меня vc2008. Да и вообще Саттер правильно написал : - старайтесь обоходить стороной «темные углы» языков.

jeep
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.