c++ 转发声明特定模板示例

a14dhokn  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(104)

我有一个模板就是这样的--一个非常基本的类模板;比如:
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只是一个模板的“示例”,不应该需要特殊的处理,或者是吗?
错误中的“不同基本类型”指的是什么?

qxsslcnc

qxsslcnc1#

第一个声明说MyClass是一个类,第二个声明说它不是,它是一个别名,这两个声明是不同的。
这个问题与模板无关。

class A;

  class B
  {};

  using A = B;

一个可能的解决方法是让MyClass真正成为一个类,但从模板示例派生它。

class MyClass;

class MyClass : public Tmpl<SomeClass>
{ };

相关问题