pointer to member function as template argument | | |
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 | | | | re: pointer to member function as template argument
Damien wrote:[color=blue]
> 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.[/color]
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 | | | | re: pointer to member function as template argument
Damien wrote:[color=blue]
> 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
> {[/color]
public:
[color=blue]
> int FuncWithReturn(){return 0;}
> void VoidFunc(int arg){};
> };
>
> template TemplateRetFunc<class T, class RetType, RetType (T::*F)() >[/color]
Syntax error!
[color=blue]
> {
> };
>
> 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.[/color]
Compiler bug/non-compliance issue. VC6 has lots of them.
Tom | | | | re: pointer to member function as template argument
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 | | | | re: pointer to member function as template argument
Damien wrote:[color=blue]
> 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[/color]
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();
} |  | | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 226,411 network members.
|