请考虑以下示例:
template <int N, int M>
class MyClass {
private:
void myFunc(void);
public:
void callMe(void);
};
我需要声明一个指向此类对象的通用指针。编译器拒绝以下语句。我究竟做错了什么?感谢您的帮助。
extern template<int N, int M> MyClass<N, M> *obj;
为什么我要这样做?我需要编写一个能够处理此类中对象的通用实例的函数,请参见示例:
inline template <int N, int M> void MyClass<N,M>::MyFunc(void) { obj = this; };
如果可能的话,这是我想要的行为。 请注意,它可以与NON TEMPLATE类型完美配合。
void ThisIsAnotherFunction(void) {
obj->callMe();
}
答案 0 :(得分:3)
您的不同模板类将没有共同之处。您可以做的是让您的模板化类共享一个公共基类,如下所示:
struct BaseClass {};
template <int N, int M>
class MyClass : BaseClass {
/*stuff*/
};
extern BaseClass* obj;
如果要使用指向特定具体类型的指针,则别无选择,只能在声明中提供N和M的值。
extern MyClass<2, 3>* obj2;
答案 1 :(得分:0)
您的问题至少允许两种解释...
I)...您想要运行时多态性
同一模板的不同实例是完全不相关的类型。如果希望它们共享一个公共接口,则可以使用一个公共基类:
struct base {
/* declare common interface here */
};
template <int N, int M> struct foo : base {};
II)...您想要每个临时模板实例的变量obj
这闻起来像单身,我不确定这样做是否有意义,但那会是这样的:
template <int N,int M> struct foo {
constexpr static const foo* obj = new foo();
};
答案 2 :(得分:0)
For the records, I resolved by using the suggestion wrote by #user463035818 (thanks dude!). I created a base class with callMe as virtual function (refer to initial example). Thanks to all that provided their support. Hope to retribute soon.