Original Post
The following legal code doesn''t work and is known to not work in MSVC 6:
Does anyone have a simple work around to make this work in MSVC 6? The optimal solution would look the most like that code. If I can''t get that kind of thing to work somehow I''ll have to drop support of MSVC 6, and many Windows (co-)developers might not like that. The two best (but obviously lacking) workarounds I''ve come up with so far:
So, what''s your suggestion?

#include <iostream>
class inner_base {
public:
virtual void output(void) = 0;
};
class inner_a : public inner_base {
public:
virtual void output(void) { std::cout << "inner_a" << std::endl; }
};
class inner_b : public inner_base {
public:
virtual void output(void) { std::cout << "inner_b" << std::endl; }
};
class outer {
private:
inner_base *my_inner;
public:
template <class T>
inline void create_inner(void) {
delete my_inner;
my_inner = new T;
}
inline void output(void) {
if(my_inner) my_inner->output();
}
outer(void) : my_inner(NULL) { }
~outer(void) { delete my_inner; }
};
int main(void) {
outer my_outer;
// MSVC 6''s deficiency comes up right here
my_outer.create_inner<inner_b>();
my_outer.output();
return 0;
}
#include <iostream>
class inner_base {
public:
virtual void output(void) = 0;
};
class inner_a : public inner_base {
public:
virtual void output(void) { std::cout << "inner_a" << std::endl; }
static inline inner_base *spawn(void) { return (inner_base *) new inner_a; }
};
class inner_b : public inner_base {
public:
virtual void output(void) { std::cout << "inner_b" << std::endl; }
static inline inner_base *spawn(void) { return (inner_base *) new inner_b; }
};
class outer {
private:
inner_base *my_inner;
public:
template <class T>
inline void create_inner(T spawn) {
delete my_inner;
my_inner = spawn();
}
inline void output(void) {
if(my_inner) my_inner->output();
}
outer(void) : my_inner(NULL) { }
~outer(void) { delete my_inner; }
};
int main(void) {
outer my_outer;
my_outer.create_inner(&inner_b::spawn);
my_outer.output();
return 0;
}
#include <iostream>
class inner_base {
public:
virtual void output(void) = 0;
};
class inner_a : public inner_base {
public:
virtual void output(void) { std::cout << "inner_a" << std::endl; }
};
class inner_b : public inner_base {
public:
virtual void output(void) { std::cout << "inner_b" << std::endl; }
};
class outer {
private:
inner_base *my_inner;
public:
template <class T>
inline void create_inner(const T _T) {
delete my_inner;
my_inner = new T;
}
inline void output(void) {
if(my_inner) my_inner->output();
}
outer(void) : my_inner(NULL) { }
~outer(void) { delete my_inner; }
};
int main(void) {
outer my_outer;
my_outer.create_inner(inner_b());
my_outer.output();
return 0;
}
