Are clang++ and libc++ compatible?

David Chisnall theraven at FreeBSD.org
Tue Nov 12 17:10:03 UTC 2013


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



More information about the freebsd-current mailing list