Re: Conversion constructor vs. conversion operator Organization: Arcor Organization: Arcor
Am 18.05.2011 00:47, schrieb Matthias Hofmann:
"Daniel Kr?gler"<daniel.kruegler@googlemail.com> schrieb im Newsbeitrag news:iqr125$52k$1@dont-email.me...
[..]
A very simple way to that is to assign friendship as follows
template<typename T>
class SmartPtr
{
template<typename>
friend class SmartPtr;
[..] // as before
};
Thanks for the detailed explanation. I am somewhat confused about the syntax
of the template friend declaration. I would have expected it to be as
follows:
template<typename T>
class SmartPtr
{
// Compile time error!
template<typename U>
friend class SmartPtr<U>;
};
However, this does not compile. It does compile if I remove the "<U>" after
SmartPtr, but then I don't need the "U" in the preceding line any more,
which leads to the syntax you are using. So I guess your example is correct,
although I do not fully understand the underlying rules...
Your example just violates the grammar for a friend declaration. Basically, this is just a declaration with "friend" as one further /decl-specifier/. Now remember that a declaration of a normal class template like above is simply written as
template<typename T>
class SmartPtr;
or
template<typename>
class SmartPtr;
because the template parameter is not used. Within the definition of
template<typename T>
class SmartPtr {};
you cannot use T again for a template parameter of a nested template, so either remove the parameter name or invent a different name (like U).
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]