Re: Are clang++ and libc++ compatible?

From: David Chisnall <theraven_at_FreeBSD.org>
Date: Tue, 12 Nov 2013 17:09:54 +0000
On 12 Nov 2013, at 16:54, Steve Kargl <sgk_at_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_at_troutmask.apl.washington.edu> wrote:
>> 
>>> Trying to build news/pan with clang++ dies with
>>> 
>>> 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 = sizeof(value_type) < 256 ? 4...
>>> 
>>> Anyone know how to fix either clang++ or libc++?
>> 
>> 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.
>> 
> 
> 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)
> 
> #ifndef __Log_h__
> #define __Log_h__
> 
> #include <ctime>
> #include <set>
> #include <string>
> #include <deque>
> 
> namespace pan
> {
>  class Log
>  {
>    public:
>      enum Severity {
>        PAN_SEVERITY_INFO = 1,
>        PAN_SEVERITY_ERROR = 2,
>        PAN_SEVERITY_URGENT = (1<<10)
>      };
> 
>      struct Entry {
>        time_t date;
>        Severity severity;
>        std::deque<Entry> messages;
>        std::string message;
>        bool is_child;
>        Entry() : is_child(false) { }
>      };
> 
>      void add_entry(Entry& e, std::deque<Entry>& list);
> 
> 
> 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.  

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
Received on Tue Nov 12 2013 - 16:10:03 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:44 UTC