On Tue, Nov 12, 2013 at 11:54 AM, 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. 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? The problem here is that the code is trying to make a std::deque of the type Entry before Entry is fully defined. This is nearly identical to the problem in the simplified C code below: struct foo { struct foo bar; } -- Eitan AdlerReceived on Tue Nov 12 2013 - 17:11:35 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:44 UTC