layout | title | permalink |
---|---|---|
page |
Q130486: PRB: LNK2001 on Pure Virtual Operator= |
/kb/130/Q130486/ |
{% raw %}
Article: Q130486
Product(s): Microsoft C Compiler
Version(s): 1.0,2.0,2.1,4.0,5.0
Operating System(s):
Keyword(s): kbCompiler kbCPPonly kbVC100 kbVC200 kbVC210 kbVC400 kbVC500 kbVC600
Last Modified: 13-JUN-2002
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 2.1, 4.0
- Microsoft Visual C++, 32-bit Enterprise Edition, version 5.0
- Microsoft Visual C++, 32-bit Professional Edition, version 5.0
- Microsoft Visual C++.NET (2002)
-------------------------------------------------------------------------------
SYMPTOMS
========
When building an application that contains a base class with a pure virtual
operator= function and a class derived from the base class with a defined
operator= function, a following link error is generated for the base class's
operator=:
error LNK2001: unresolved external symbol
This also occurs if the classes reside in a DLL and are declared with the
__declspec( dllexport ) storage-class attribute.
In Visual C++ .NET you will receive the following error message:
LNK2019: unresolved external symbol
CAUSE
=====
This behavior is by design. The assignment operator is not inherited. Normal
inheritance rules do not apply, and declaring it pure virtual does not have the
usual affect.
RESOLUTION
==========
Since operator= is not inherited, any declaration of operator= in the base class
is unused and unnecessary. Do not declare the operator= in the base class.
MORE INFORMATION
================
When built, the following code sample will generate the discussed LNK2001 error.
Comment the declaration of the operator=() member in the base class to resolve.
Sample Code
-----------
/* Compile options needed: none
*/
class A
{
public :
// To workaround LNK2001, comment the following line.
virtual const A& operator=( const A& f ) = 0;
};
class B : public A
{
public :
const A& operator=( const A& g ) {return g;}
};
B aB1, aB2;
void main( void )
{
aB2 = aB1;
}
Additional query words: 9.00 9.10
======================================================================
Keywords : kbCompiler kbCPPonly kbVC100 kbVC200 kbVC210 kbVC400 kbVC500 kbVC600
Technology : kbVCsearch kbVC400 kbAudDeveloper kbvc100 kbVC500 kbVC200 kbVC210 kbVC32bitSearch kbVCNET kbVC500Search
Version : :1.0,2.0,2.1,4.0,5.0
Issue type : kbprb
=============================================================================
{% endraw %}