This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: C++ 'extern inline' magic possible?


On 03/01/2011 04:52 PM, Jonathan Wakely wrote:
On 1 March 2011 12:14, Kevin P. Fleming wrote:

Yes, that was what my original post requested, but I now understand that any solution that offered that would be non-compliant with the C++ standard. I believe this code base is only using this technique to shave some compile time for TUs that don't actually need the class definitions (they only receive and send around pointers to the classes), but it's a cause of lower performance and so I'll have to figure out whether removing the 'forward declaration only' mechanism will be worth the effort.

There is another option, which I'm loathe to mention ...

<snip macro example which makes everyone shudder <G>>


Yes, I considered that. I did arrive at a potential solution, although I can't use it in this particular code base because of other complications, but...

== test.h ==
class Foo;

void opaqueBar(Foo*);

template <typename T>
void Bar(T* obj)
{
	opaqueBar(obj);
}

== test1.h ==
#include "test.h"

static void test1(Foo* obj)
{
	Bar(obj);
}

== test2.h ==
#include "test.h"

class Foo
{
public:
	void realBar();
};

template <>
inline void Bar<Foo>(Foo* obj)
{
	obj->realBar();
}

static void test2(Foo* obj)
{
	Bar(obj);
}

I think this still might be an ODR violation though, since there will end up being two definitions of Bar() for Foo.

--
Kevin P. Fleming
Digium, Inc. | Director of Software Technologies
445 Jan Davis Drive NW - Huntsville, AL 35806 - USA
skype: kpfleming | jabber: kfleming@digium.com
Check us out at www.digium.com & www.asterisk.org


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]