template function problem

M

Micha Bieber

Hallo group,

VC6 gives me an error in the marked row of the code snippet below:

error C2664: 'defineIOHandler' : conversion of parameter 3 from 'bool
(class Qwt3D::plot3D *,const char *)' to 'bool (__cdecl *)(class
Qwt3D::plot3D *,const char *)' not possible.

The culprit is the pointer to the specialization of writeQt. On the
other hand, if I use a function pointer to the following function no
error occurs during compilation:

bool writeQtNoTemplate(Qwt3D::plot3D* plot, const char* fname)
{...}

The 3th argument argument in defineIOHandler is a function pointer
defined as follows:

// ... typedef inside a traits class
typedef bool (*ioroutine)( T*, const char* fname );


2nd question:
The inline statement prevents linker errors regarding multiple defined
functions. How is the rule for templates here ? IMO it is highly
possible that the function becomes actually not inlined (contains a
loop). Is this 'hack' sure in the sense, that it should always enforce
uniqueness of the function?


TIA,
Micha


--- snip --

struct StringMap
{
static std::vector<QString> smap;
};


template <typename SMAP, int IDX>
bool writeQt(Qwt3D::plot3D* plot, const char* fname)
{
if (!plot)
return false;

QImage im = plot->grabFrameBuffer(true);
return im.save(fname, SMAP::smap[IDX]);
}

inline void defineQtIOHandler()
{
static StringMap sm;
for ( int i = 0; i < QImageIO::eek:utputFormats().count(); i++ )
{
QString format = QString( QImageIO::eek:utputFormats().at( i ) );
StringMap::smap.push_back(format);
// error begin
defineIOHandler<Qwt3D::plot3D>( format, 0, writeQt<StringMap,i>);
//error end
}
}

--- snap ---
 
M

Micha Bieber

Micha said:
2nd question:
The inline statement prevents linker errors regarding multiple defined
functions. How is the rule for templates here ? IMO it is highly

Sorry, I had no templates in mind here, but a non-template global
function.

Micha
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,073
Latest member
DarinCeden

Latest Threads

Top