This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/21543] Full specialization of templates not supported in classes
- From: "sven at clio dot in-berlin dot de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 15 May 2005 17:58:20 -0000
- Subject: [Bug c++/21543] Full specialization of templates not supported in classes
- References: <20050513094441.21543.sven@clio.in-berlin.de>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Additional Comments From sven at clio dot in-berlin dot de 2005-05-15 17:58 -------
This is the last try. First I wonder who has invented the strange syntax for
defining template member classes outside. C++ is still an imperative
programming language, not a functional. A straightforward syntax would be
template<typename _T>
struct heap<_T>::template<>
struct iterator: wrapper<typename heap<_T>::pointer> {};
But that is not Your concern (unless You are a member of the standardization
comitee). The errors I get now is:
test.cpp:32: error: aggregate `heap<int>::iterator<container::pointer> p' has
incomplete type and cannot be defined
test.cpp:32: error: storage size of `p' isn't known
Simply untrue.
If You replace line 29 with
struct heap<_T>::iterator<container::pointer>:
the errors are
test.cpp:29: error: template parameters not used in partial specialization:
test.cpp:29: error: `_T'
test.cpp:32: error: aggregate `heap<int>::iterator<container::pointer> p' has
incomplete type and cannot be defined
test.cpp:32: error: storage size of `p' isn't known
Anyway, the workaround posted earlier is much more comprehensive and easier to
read.
--- test.cpp
template<typename _T>
class wrapper
{
public:
wrapper(): _M_t() {}
wrapper(_T t): _M_t(t) {}
operator _T& () { return _M_t; }
private:
_T _M_t;
};
struct container
{
struct pointer {};
struct forward {};
struct backward {};
struct bidirectional {};
struct randomaccess {};
};
template<typename _T>
struct heap: container
{
typedef _T value_type;
template<typename _U> struct iterator;
};
template<> template<typename _T>
struct heap<_T>::iterator<typename heap<_T>::pointer>: // line 29
wrapper<typename heap<_T>::value_type *> {};
heap<int>::iterator<heap<int>::pointer> p;
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21543