Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Nov 2013 17:09:54 +0000
From:      David Chisnall <theraven@FreeBSD.org>
To:        Steve Kargl <sgk@troutmask.apl.washington.edu>
Cc:        freebsd-current@FreeBSD.org
Subject:   Re: Are clang++ and libc++ compatible?
Message-ID:  <48CC87B2-C2D2-44F8-A7DE-4D870E68E7D9@FreeBSD.org>
In-Reply-To: <20131112165422.GA2939@troutmask.apl.washington.edu>
References:  <20131112163219.GA2834@troutmask.apl.washington.edu> <77CB2B92-216A-4C80-B033-7E582B5F0DFC@FreeBSD.org> <20131112165422.GA2939@troutmask.apl.washington.edu>

next in thread | previous in thread | raw e-mail | index | archive | help

On 12 Nov 2013, at 16:54, Steve Kargl <sgk@troutmask.apl.washington.edu> =
wrote:

> On Tue, Nov 12, 2013 at 04:38:17PM +0000, David Chisnall wrote:
>> On 12 Nov 2013, at 16:32, Steve Kargl =
<sgk@troutmask.apl.washington.edu> wrote:
>>=20
>>> Trying to build news/pan with clang++ dies with
>>>=20
>>> gmake[3]: Entering directory =
`/usr/ports/news/pan/work/pan-0.139/pan/general'
>>> CXX    file-util.o
>>> In file included from file-util.cc:38:
>>> In file included from ./log.h:26:
>>> /usr/include/c++/v1/deque:907:49: error: invalid application of =
'sizeof' to an
>>>     incomplete type 'value_type' (aka 'pan::Log::Entry')
>>>   static const difference_type __block_size =3D sizeof(value_type) < =
256 ? 4...
>>>=20
>>> Anyone know how to fix either clang++ or libc++?
>>=20
>> The error here does not appear to be in clang or libc++, but in the
>> use by the thing that you are compiling.
>> This is saying that you have tried to create a =
std::dequeu<pan::Log::Entry>,
>> but pan::Log::Entry is a forward declaration and so the template
>> instantiation fails.
>> The fix is to move the definition of pan::Log::Entry such that it
>> is visible at the time of its use.
>>=20
>=20
> I don't know C++, but it is at all like C, then the header files
> are normally placed at the top of a file before one's code.

Yes, that's normal in C++ too.

>  In
> this case, the code in news/pan/work/pan-0.139/pan/general/log.h
> looks like (where I've striped comment to keep it short)
>=20
> #ifndef __Log_h__
> #define __Log_h__
>=20
> #include <ctime>
> #include <set>
> #include <string>
> #include <deque>
>=20
> namespace pan
> {
>  class Log
>  {
>    public:
>      enum Severity {
>        PAN_SEVERITY_INFO =3D 1,
>        PAN_SEVERITY_ERROR =3D 2,
>        PAN_SEVERITY_URGENT =3D (1<<10)
>      };
>=20
>      struct Entry {
>        time_t date;
>        Severity severity;
>        std::deque<Entry> messages;
>        std::string message;
>        bool is_child;
>        Entry() : is_child(false) { }
>      };
>=20
>      void add_entry(Entry& e, std::deque<Entry>& list);
>=20
>=20
> Are you saying that I need to move '#include <deque>' to
> the location above the 'void add_entry(...)' line?

No, I'm saying that the definition of struct Entry needs to be complete =
before its use in the specialisation of std::deque. =20

I'd perhaps be able to be more helpful if you hadn't removed from the =
error message the part that tells you where the error actually is...

David




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?48CC87B2-C2D2-44F8-A7DE-4D870E68E7D9>