15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Exporting template classes from a DLL ?

Yves Monier -- Yves.Monier@grenoble.rxrc.xerox.com
Tuesday, April 16, 1996

Hello,

My environment is VC++ 4.0 / NT 3.51.

I am trying to build a DLL (32 bits, of course). This DLL has to export many 
classes, using the _declspec(dllexport) specifier.
Some of these classes are templates classes. So I thought that something like 
the following code should be ok :

template class _declspec(dllexport) Class1 {
 // ... 
};

The problem is that the compiler produces two errors :
error C2960: template 'class' requires a tag-name
error C2988: unrecognizable template declaration/definition

Of course, if I remove the _declspec(dllexport) specifier, no errors are 
produced, but also no .lib file for my DLL ! :-(

The same code compiled without any problem with Borland C++ 4.5 (to produce a
16 bits DLL, with MYEXPORT defined to _export).

Any idea ?

Thanks in advance,


Yves




Chet Murphy -- cmurphy@modelworks.com
Wednesday, April 17, 1996

[Mini-digest: 2 responses]

Yves Monier wrote:
> 
> Hello,
> 
> My environment is VC++ 4.0 / NT 3.51.
> 
> I am trying to build a DLL (32 bits, of course). This DLL has to export many
> classes, using the _declspec(dllexport) specifier.
> Some of these classes are templates classes. So I thought that something like
> the following code should be ok :
> 
> template class _declspec(dllexport) Class1 {
>  // ...
> };
> 
> The problem is that the compiler produces two errors :
> error C2960: template 'class' requires a tag-name
> error C2988: unrecognizable template declaration/definition
> 
> Of course, if I remove the _declspec(dllexport) specifier, no errors are
> produced, but also no .lib file for my DLL ! :-(
> 
> The same code compiled without any problem with Borland C++ 4.5 (to produce a
> 16 bits DLL, with MYEXPORT defined to _export).
> 
> Any idea ?
> 
> Thanks in advance,
> 
> Yves

Yves,

A template class is built by the compiler not by a linker using object 
code.  If you want to export a template class you have to provide the 
C++ source code.

--Chet Murphy
ModelWorks Software
cmurphy@modelworks.com
http://www.modelworks.com/express

-----From: "David W. Gillett" 

  The leading '_' in '_export' and '_declspec' indicates that these 
are not standard parts of the language, but are compiler-specific.  
So the short/rude answer is that Microsoft is free to ignore what 
Borland does with '_export' when deciding what to do with 
'_declspec'.

  The longer answer is that I really doubt that you can meaningfully 
export the template itself from the DLL, because that would require 
users of the DLL to somehow be able to instantiate new template-based 
classes relying on code hidden inside the DLL.
  What you *can* reasonably expect to do is instantiate classes in 
the DLL using the template, and export them.  It seems to me that the 
Borland approach lets you export all/whatever instantiations of the 
template that happen to occur in your DLL -- this is convenient, but 
may be overkill and questionably robust.
  It looks to me like MS doesn't let you do this.  But what I would 
try instead -- and I would expect it to work for both compilers -- is 
to explicitly instantiate the template-based classes you really want 
to export, and export those on a case-by-case basis.  (Or not, if 
there are some instantiations that you want to be private to the 
DLL.)
  This is a little bit of work, but provides you with finer control 
over what gets exported -- IMHO, you should already be explicitly 
instantiating the classes you want exported, so the additional effort 
is really trivial.

Dave




Terry Trippany -- terryt@str.com
Tuesday, April 23, 1996

Hi,

It is my belief that template classes cannot be exported using VC++ 4.0. In
order to export classes you must tag them with declspec(dllexport) in the
library, and _declspec(dllimport) in the using module.  You can't do this in
the template definition, and thus, can't export the templatized class.  I do
believe you can however export individual methods in a template class. 

Terry Trippany
Strategic Technology Resources
"I persist, therefore I am!"

At 11:21 PM 4/17/96 -0600, you wrote:
>[Mini-digest: 2 responses]
>
>Yves Monier wrote:
>> 
>> Hello,
>> 
>> My environment is VC++ 4.0 / NT 3.51.
>> 
>> I am trying to build a DLL (32 bits, of course). This DLL has to export many
>> classes, using the _declspec(dllexport) specifier.
>> Some of these classes are templates classes. So I thought that something like
>> the following code should be ok :
>> 
>> template class _declspec(dllexport) Class1 {
>>  // ...
>> };
>> 
>> The problem is that the compiler produces two errors :
>> error C2960: template 'class' requires a tag-name
>> error C2988: unrecognizable template declaration/definition
>> 
>> Of course, if I remove the _declspec(dllexport) specifier, no errors are
>> produced, but also no .lib file for my DLL ! :-(
>> 
>> The same code compiled without any problem with Borland C++ 4.5 (to produce a
>> 16 bits DLL, with MYEXPORT defined to _export).
>> 
>> Any idea ?
>> 
>> Thanks in advance,
>> 
>> Yves
>
>Yves,
>
>A template class is built by the compiler not by a linker using object 
>code.  If you want to export a template class you have to provide the 
>C++ source code.
>
>--Chet Murphy
>ModelWorks Software
>cmurphy@modelworks.com
>http://www.modelworks.com/express
>
>-----From: "David W. Gillett" 
>
>  The leading '_' in '_export' and '_declspec' indicates that these 
>are not standard parts of the language, but are compiler-specific.  
>So the short/rude answer is that Microsoft is free to ignore what 
>Borland does with '_export' when deciding what to do with 
>'_declspec'.
>
>  The longer answer is that I really doubt that you can meaningfully 
>export the template itself from the DLL, because that would require 
>users of the DLL to somehow be able to instantiate new template-based 
>classes relying on code hidden inside the DLL.
>  What you *can* reasonably expect to do is instantiate classes in 
>the DLL using the template, and export them.  It seems to me that the 
>Borland approach lets you export all/whatever instantiations of the 
>template that happen to occur in your DLL -- this is convenient, but 
>may be overkill and questionably robust.
>  It looks to me like MS doesn't let you do this.  But what I would 
>try instead -- and I would expect it to work for both compilers -- is 
>to explicitly instantiate the template-based classes you really want 
>to export, and export those on a case-by-case basis.  (Or not, if 
>there are some instantiations that you want to be private to the 
>DLL.)
>  This is a little bit of work, but provides you with finer control 
>over what gets exported -- IMHO, you should already be explicitly 
>instantiating the classes you want exported, so the additional effort 
>is really trivial.
>
>Dave
>
>
>




Clarence Chiang -- clarence@spiderisland.com
Thursday, April 25, 1996

I think it is a more fundamental problem. Since a template class only 
exists during compile-time, after the compiler instantiates a template 
class with a concrete type the template class is gone. So it is no point 
to export a template class in a dll since a program can't possibly 
instantiates a template class with a concrete type at runtime.

Clarence Chiang
Spider Island Software





| Вернуться в корень Архива |