By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
429,557 Members | 1,406 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 429,557 IT Pros & Developers. It's quick & easy.

pointer to member function as template argument

P: n/a
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

Apr 18 '06 #1
Share this Question
Share on Google+
4 Replies


P: n/a
Damien wrote:
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
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Apr 18 '06 #2

P: n/a
Damien wrote:
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
Apr 18 '06 #3

P: n/a
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

Apr 18 '06 #4

P: n/a

Damien wrote:
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();
}

Apr 20 '06 #5

This discussion thread is closed

Replies have been disabled for this discussion.