On 12 Nov 2013, at 16:54, Steve Kargl <s...@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 <s...@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

_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to