Connecting Tech Pros Worldwide Help | Site Map

template function problem

Micha Bieber
Guest
 
Posts: n/a
#1: Jul 22 '05
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::outputFormats().count(); i++ )
{
QString format = QString( QImageIO::outputFormats().at( i ) );
StringMap::smap.push_back(format);
// error begin
defineIOHandler<Qwt3D::Plot3D>( format, 0, writeQt<StringMap,i>);
//error end
}
}

--- snap ---

Micha Bieber
Guest
 
Posts: n/a
#2: Jul 22 '05

re: template function problem


Micha Bieber wrote:
[color=blue]
>
> 2nd question:
> The inline statement prevents linker errors regarding multiple defined
> functions. How is the rule for templates here ? IMO it is highly[/color]

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

Micha
[color=blue]
> 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?
>[/color]

Micha Bieber
Guest
 
Posts: n/a
#3: Jul 22 '05

re: template function problem


Micha Bieber wrote:
[color=blue]
>
> 2nd question:
> The inline statement prevents linker errors regarding multiple defined
> functions. How is the rule for templates here ? IMO it is highly[/color]

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

Micha
[color=blue]
> 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?
>[/color]

Closed Thread