Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 别名vs空的新扩展类_C++ - Fatal编程技术网

C++ 别名vs空的新扩展类

C++ 别名vs空的新扩展类,c++,C++,编辑2: 好的,我可以重新表述这个问题,除了使用不同的类型外,空扩展类和它的基类之间有什么区别吗?内存大小是否相同,它们在功能上是否相同 这个完全空的类定义与别名的编译代码和/或性能有什么不同吗?或者这取决于编译器,在这种情况下,它可能会被优化掉 class MyClass : MyTemplateClass<int>{}; using MyClass = MyTemplateClass<int>; 州政府 class State { void Modify(

编辑2:

好的,我可以重新表述这个问题,除了使用不同的类型外,空扩展类和它的基类之间有什么区别吗?内存大小是否相同,它们在功能上是否相同


这个完全空的类定义与别名的编译代码和/或性能有什么不同吗?或者这取决于编译器,在这种情况下,它可能会被优化掉

class MyClass : MyTemplateClass<int>{};
using MyClass = MyTemplateClass<int>;
州政府

class State {
    void Modify(MyClass&);
}
MyTemplate.h

template<typename T>
class MyTemplateClass<int> {
    void run(Master* pMaster) {
         pMaster->run();
    }
};

using MyClass = MyTemplateClass<int>;
模板
类MyTemplateClass{
无效运行(主*主){
pMaster->run();
}
};
使用MyClass=MyTemplateClass;
“State.h”需要包含“MyTemplate.h”,Template.h需要包含“Master.h”,而“Master.h”需要包含“State.h”,完成了这个循环。如果MyClass不是别名而是实际的类,则State不需要包含模板,并且可以转发声明MyClass

让我们看看:

#include <iostream>
#include <typeinfo>

template<class T> struct MyTemplateClass {};

class MyClass1 : MyTemplateClass<int>{};

using MyClass2 = MyTemplateClass<int>;


int main()
{
    std::cout << typeid(MyClass1).name() << std::endl;
    std::cout << typeid(MyClass2).name() << std::endl;
}

不同的类型。

其中一个定义类型,另一个不定义类型。它们真的不可比。类定义需要它继承自的类型的完整类定义,因此它使您处于与您已经处于的相同的困境中。“using”声明(在这种形式中)只是语法上的糖分,它不做简单地在右边键入名称所不能做的事情。您可能对转发声明的作用以及它们何时有用感到困惑,但如果没有进一步的上下文,我无法为您试图解决的问题提供任何正确的前进方向的建议。在我的情况下,这将导致解决循环依赖性.XY问题的更好方法。如果你想避免循环依赖,你可以直接转发declare
MyTemplateClass
。我不想转发declare MyTemplateClass,因为它是一个相当大的模板,然后我不得不多次使用同一个别名。我真的不清楚你在问什么。正向声明和循环依赖与别名无关。我不在乎它们是不同的类型,我不需要在它们之间进行转换或任何泛型。我只需要它在定义空类而不是别名时不会减慢速度。模板是一种工厂,用于生成不可交换的类。@Bartwerne我不确定我是否理解您想要做什么。你刚才提到了远期申报。你能修改这个问题来说明你遇到的问题吗?
#include <iostream>
#include <typeinfo>

template<class T> struct MyTemplateClass {};

class MyClass1 : MyTemplateClass<int>{};

using MyClass2 = MyTemplateClass<int>;


int main()
{
    std::cout << typeid(MyClass1).name() << std::endl;
    std::cout << typeid(MyClass2).name() << std::endl;
}
8MyClass1
15MyTemplateClassIiE