Derive from STL Map

Question:
I created my own map class (called it Mapper) by creating a template class and deriving from STL map container class. I did so because I wanted to have some extra user-defined methods in this class. I don’t have any problems compiling if I only use the methods provided by the STL map class. However, when I try to make a call to one of the new methods in Mapper, I get the following linking error:

--------------------Configuration: mapfunc - Win32 Debug--------------------Compiling...runmapper.cppLinking...runmapper.obj : error LNK2001: unresolved external symbol 
"public: int __thiscall Mapper::SmartMatch(class
std::basic_stringshort>,class std::allocator > const &)" (?
[email protected][email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z)Debug/mapfunc.exe : fatal error LNK1120: 1 unresolved externalsError executing link.exe.mapfunc.exe - 2 error(s), 0 warning(s)

By the way, runmapper.cpp is the driver program and mapfunc is the project name. I have three user-defined methods (one of them is SmartMatch(key)) that when I try to call, from the driver program, give me the same compilation error (linking error).

Answer:
The compiler must see the definition, not just the declaration, of a template in order to instantiate it. It looks like you #included only the declaration (i.e., the prototype) of your added member function:

int Mapper::SmartMatch(std::wstring); //  prototype

The compiler needs to see its definitions (implementation), too. If you’re using Visual C++, my advice is to implement template member functions inline, inside the header file that declares the class template.

Note that deriving from STL containers is usually a bad idea because STL containers have no virtual destructors or virtual member functions. This can cause undefined behavior in certain conditions, for example, if you pass a pointer to std::map<> which actually points to a class derived from std::map<> and has its own destructor. In this case, the derived class’s destructor isn’t called:

// mapper is derived from std::mapstd::map < int > * p new mapper < int >; delete p; /*undefined behavior; only map < int >::~map < int > called*/

If you need to extend STL’s functionality, it’s better to use containment rather than public inheritance.

Share the Post:
Share on facebook
Share on twitter
Share on linkedin

Overview

The Latest

homes in the real estate industry

Exploring the Latest Tech Trends Impacting the Real Estate Industry

The real estate industry is changing thanks to the newest technological advancements. These new developments — from blockchain and AI to virtual reality and 3D printing — are poised to change how we buy and sell homes. Real estate brokers, buyers, sellers, wholesale real estate professionals, fix and flippers, and beyond may

man on floor with data

DevX Quick Guide to Data Ingestion

One of the biggest trends of the 21st century is the massive surge in internet usage. With major innovations such as smart technology, social media, and online shopping sites, the internet has become an essential part of everyday life for a large portion of the population. Due to this internet

payment via phone

7 Ways Technology Has Changed Traditional Payments

In today’s digital world, technology has changed how we make payments. From contactless cards to mobile wallets, it’s now easier to pay for goods and services without carrying cash or using a checkbook. This article will look at seven of the most significant ways technology has transformed traditional payment methods.