pointer to member function as template argument

Discussion in 'C++' started by Damien, Apr 18, 2006.

  1. Damien

    Damien Guest

    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
     
    Damien, Apr 18, 2006
    #1
    1. Advertising

  2. 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
     
    Victor Bazarov, Apr 18, 2006
    #2
    1. Advertising

  3. Damien

    Tom Widmer Guest

    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
     
    Tom Widmer, Apr 18, 2006
    #3
  4. Damien

    Damien Guest

    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
     
    Damien, Apr 18, 2006
    #4
  5. Damien

    Fei Liu Guest

    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();
    }
     
    Fei Liu, Apr 20, 2006
    #5
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Gert  Van den Eynde
    Replies:
    8
    Views:
    651
    Keith H Duggar
    Jan 26, 2004
  2. Fraser Ross
    Replies:
    4
    Views:
    1,094
    Fraser Ross
    Aug 14, 2004
  3. Vijai Kalyan
    Replies:
    4
    Views:
    746
    Vijai Kalyan
    Nov 8, 2005
  4. avasilev
    Replies:
    4
    Views:
    595
    avasilev
    Dec 22, 2011
  5. somenath
    Replies:
    2
    Views:
    178
    somenath
    Aug 29, 2013
Loading...

Share This Page