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>