pointer to member function as template argument

D

Damien

Hi all,

I've run into something confusing on MS VC6. Yeah I know it's old but
that's what the client wants, so...

I'm trying to pass a pointer to a member function as a template
argument, and the compiler gives me an invalid template argument on the
member function address if the member function returns a type. A
member function with a void return type is fine. The example below
demonstrates the problem:

class SomeClass
{
int FuncWithReturn(){return 0;}
void VoidFunc(int arg){};
};

template TemplateRetFunc<class T, class RetType, RetType (T::*F)() >
{
};

template TemplateVoidFunc<class T, class Arg, void (T::*F)(Arg) >
{
};

int main()
{
TemplateRetFunc<SomeClass, int, &SomeClass::FuncWithReturn> test1;
//error
TemplateVoidFunc<SomeClass, int, &SomeClass::VoidFunc> test2; //OK
return 0;
}

Anyone know why having the return type gives an error? I'm fine if I
have to use a void return, I just want to know why.

Damien

Damien
 
V

Victor Bazarov

Damien said:
I've run into something confusing on MS VC6. Yeah I know it's old but
that's what the client wants, so...

I'm trying to pass a pointer to a member function as a template
argument, and the compiler gives me an invalid template argument on
the member function address if the member function returns a type. A
member function with a void return type is fine. The example below
demonstrates the problem:

class SomeClass
{
int FuncWithReturn(){return 0;}
void VoidFunc(int arg){};
};

template TemplateRetFunc<class T, class RetType, RetType (T::*F)() >
{
};

template TemplateVoidFunc<class T, class Arg, void (T::*F)(Arg) >
{
};

int main()
{
TemplateRetFunc<SomeClass, int, &SomeClass::FuncWithReturn> test1;
//error
TemplateVoidFunc<SomeClass, int, &SomeClass::VoidFunc> test2; //OK
return 0;
}

Anyone know why having the return type gives an error? I'm fine if I
have to use a void return, I just want to know why.

VC6 is really bad when it comes to templates. Try to convince your client
to upgrade or to change the compiler.

V
 
T

Tom Widmer

Damien said:
Hi all,

I've run into something confusing on MS VC6. Yeah I know it's old but
that's what the client wants, so...

I'm trying to pass a pointer to a member function as a template
argument, and the compiler gives me an invalid template argument on the
member function address if the member function returns a type. A
member function with a void return type is fine. The example below
demonstrates the problem:

class SomeClass
{
public:

int FuncWithReturn(){return 0;}
void VoidFunc(int arg){};
};

template TemplateRetFunc<class T, class RetType, RetType (T::*F)() >

Syntax error!
{
};

template TemplateVoidFunc<class T, class Arg, void (T::*F)(Arg) >
{
};

int main()
{
TemplateRetFunc<SomeClass, int, &SomeClass::FuncWithReturn> test1;
//error
TemplateVoidFunc<SomeClass, int, &SomeClass::VoidFunc> test2; //OK
return 0;
}

Anyone know why having the return type gives an error? I'm fine if I
have to use a void return, I just want to know why.

Compiler bug/non-compliance issue. VC6 has lots of them.

Tom
 
D

Damien

Oh, this is embarrassing. In my haste to throw together a non-client
example I wrote utter rubbish instead of valid C++. Note to self:
Always compile examples, even little ones. Should have been:

class SomeClass
{
public:
int FuncWithReturn(){return 0;}
void VoidFunc(int arg){};
};

template <class T, class RetType, RetType (T::*F)() > class
TemplateRetFunc
{
};

template <class T, class Arg, void (T::*F)(Arg)> class TemplateVoidFunc
{
};

int main()
{
TemplateRetFunc<SomeClass, int, &SomeClass::FuncWithReturn> test1;
//error
TemplateVoidFunc<SomeClass, int, &SomeClass::VoidFunc> test2; //OK
return 0;
}

Which is fine under gcc, but barfs on VC6. Might have to encourage an
upgrade.

Sorry for wasting your time on stupid code.

Damien
 
F

Fei Liu

Damien said:
Hi all,

I've run into something confusing on MS VC6. Yeah I know it's old but
that's what the client wants, so...

I'm trying to pass a pointer to a member function as a template
argument, and the compiler gives me an invalid template argument on the
member function address if the member function returns a type. A
member function with a void return type is fine. The example below
demonstrates the problem:

class SomeClass
{
int FuncWithReturn(){return 0;}
void VoidFunc(int arg){};
};

template TemplateRetFunc<class T, class RetType, RetType (T::*F)() >
{
};

template TemplateVoidFunc<class T, class Arg, void (T::*F)(Arg) >
{
};

int main()
{
TemplateRetFunc<SomeClass, int, &SomeClass::FuncWithReturn> test1;
//error
TemplateVoidFunc<SomeClass, int, &SomeClass::VoidFunc> test2; //OK
return 0;
}

Anyone know why having the return type gives an error? I'm fine if I
have to use a void return, I just want to know why.

Damien

Damien

vc6.0sp4 fails to compile the following perfectly valid C++ code as
well. Try a better compiler.

#include <vector>
#include <iostream>

template<typename T>
class MyArray {
public:
MyArray();
~MyArray();
void append(const T& item);
void display();
private:
std::vector<T> *v;

};

template<typename T>
MyArray<T>::MyArray() {
v = new std::vector<T>();

}

template<typename T>
MyArray<T>::~MyArray() {
delete v;

}

template<typename T>
void MyArray<T>::append(const T& item) {
v->push_back(item);

}

template<typename T>
void MyArray<T>::display() {

typename std::vector<T>::iterator ivi;
for(ivi = v->begin(); ivi != v->end(); ++ivi)
std::cout << *ivi << std::endl;

}

int main(int argc, char** argv) {

MyArray<std::string> ma1;
ma1.append("Test1");
ma1.append("Test2");

ma1.display();
}
 

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,995
Messages
2,570,226
Members
46,815
Latest member
treekmostly22

Latest Threads

Top