Re: 14/8 says my code is right, compiler says it's wrong
Matthias Hofmann ha scritto:
"Alberto Ganesh Barbati" <AlbertoBarbati@libero.it> schrieb im Newsbeitrag
?14.7.1.2/6... did you read my post?
Yes, I did. But your quote of 14.7.1.2/6 only *requires* a definition,
without saying *where* it should be made.
Well, maybe that statement does not say it explicitly, but the intent is
clear: a definition is required to be available at the point of implicit
instantiation. The example following that statement in the standard
clarifies that.
template <class T> struct item_traits;
template <class T> class Item; // forward declaration
// definition of item_traits< Item<int> >
template <> struct item_traits< Item<int> >
{
static int foo(); // declaration of foo()
};
template <class T> class Item
{
public:
typedef item_traits< Item<T> > traits_type;
int foo() { return traits_type::foo(); }
};
---- item.cpp
#include "item.h"
int item_traits< Item<int> >::foo() { return 42; }
Oh, I see. That's good news. But doesn't this require the notoriously
unsupported 'export' feature? I vaguely remember that there is an exception
for template *specializations*, though...
What makes you think so? I didn't use the export keyword... so, no: you
don't need that feature. And it's not an "exception" from the rule.
Notice that the definition of item_traits< Item<int> >::foo does not
even have a the template keyword, because it's no longer a template:
it's simply a definition of a regular member function of a regular class
(albeit with a funny name) that have been declared elsewhere.
Ganesh
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]