From: Martin Sebor [mailto:[EMAIL PROTECTED] To: [email protected] Subject: Re: svn commit: r627648 - in /stdcxx/trunk/include: ./ loc/ rw/
> I'm not sure I understand the problem. Is it because we declare > some explicit template instantiations when building the library > as > > extern template __declspec(dllexport) void foo<int>(); Yes. Here the __declspec(dllexport) attribute leads to instantiating of the template class or function, but extern keyword tells to not instantiate, because the template will be instantiated in the another module. And the compiler doesn't know what to do: instantiate template in current module or not. I see that MSVC prefer __declspec(dllexport) and instantiates the template. So in example the classes string and wstring are instantiated in every .cpp file, where <string> is included. Actually this is my assumption ans I don't know exactly whether is true on not. But after this patch the size of the object files has reduced (the size of the resulting .dll in shared builds is not changed). From MSDN: -------------- Error Message '<identifier>' : '__declspec(dllexport)' and 'extern' are incompatible on an explicit instantiation The explicit template instantiation named <identifier> is modified by both the __declspec(dllexport) and extern keywords. However, these keywords are mutually exclusive. The __declspec(dllexport) keyword means instantiate the template class, while the extern keyword means do not automatically instantiate the template class. -------------- > Why does this happen, and doesn't the problem affect ordinary > classes or functions as well? I.e., wouldn't either of the two > declarations below be a problem? > > extern __declspec(dllexport) void foo(); > __declspec(dllexport) void foo(); These declarations both are the same thing. Farid.
