我有一个模板就是这样的--一个非常基本的类模板;比如:
Tmpl.h
template <typename Base>
class Tmpl: public Base
{
public:
Tmpl(): Base()
{
this->methodOfBase();
}
};
我希望能够前向声明这个Templ
的特殊版本。我通常只存储一个(共享)指针,所以在我的简单头脑中,编译器所需要知道的就是这是一个指向一个类的指针;为什么我不能这样做:
PublicClass.h
#pragma once
class MyClass;
class PublicClass {
// ....
private:
MyClass* test;
};
(我知道pragma once不在标准中...)
PublicClass.cpp
#include "MyClass.h"
#include "Tmpl.h"
class SomeClass
{
public:
void methodOfBase()
{
}
};
using MyClass = Tmpl<SomeClass>;
int main()
{
PublicClass c;
return 0;
}
在Visual Studio(2022)上,我得到一个错误:error C2371: 'MyClass': redefinition; different basic types
.
我知道,作为一种变通方法,我可以将MyMethod.h
更改为
#include "Tmpl.h"
class SomeClass;
using MyClass = Tmpl<SomeClass>;
void myMethod(MyClass* test);
但我不明白为什么MyClass使用模板的事实需要对PublicClass的用户可见(该类的所有用户都需要知道它)。
我知道编译器需要知道一个类是否是模板化的,也就是说,需要一个模板参数。但是在这种情况下,MyClass
只是一个模板的“示例”,不应该需要特殊的处理,或者是吗?
错误中的“不同基本类型”指的是什么?
1条答案
按热度按时间qxsslcnc1#
第一个声明说
MyClass
是一个类,第二个声明说它不是,它是一个别名,这两个声明是不同的。这个问题与模板无关。
一个可能的解决方法是让
MyClass
真正成为一个类,但从模板示例派生它。