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