![]() |
1
11
是的,你很接近,试试这个:
您遇到的问题是,您指定的返回类型是
如果要为foobar2执行特定的操作,可以专门针对foobar2:
编辑: 听起来您的编译器找不到模板化getrotatedcopy的定义。C++中的模板相当精细,通常的做法是将整个模板实现放在头文件中。你可以试试这个:
编辑: 我找不到GCC文件,但这里有 microsoft's documentation 在显式模板实例化和库中,它给出了一些正在发生的事情。您可能希望像我前面建议的那样在头中包含实现,或者在库中调用getrotatedcopy,或者在库中显式实例化它。见 veefu's answer 下面是语法。
这与C语言不同的原因是,C++中的模板不同于C语言,实际上为每个模板参数的不同组合创建了一个全新的类/函数。例如
至于不使用模板时的错误,实际上并没有告诉您多少,因为在实际实例化模板之前,它不会 重新更新5、6、7
您的动态类型转换将不起作用,只有当指针实际指向要转换的类的实例时,才能使用它。(它的工作原理与
我现在怀疑,你想要的是 CRTP . 您从一个ImageFilter实例开始,并希望在其上使用一个基类方法,然后获取ImageFilter的新副本。尝试以下几行:
否则,如果您真的想从ImageMatrix开始并将其转换为ImageFilter,则必须在ImageFilter上添加一个构造函数,该构造函数接受ImageMatrix。 |
![]() |
2
4
加上VEEFU所说的,C++中的模板不像C类泛型(主题被标记为C,所以我假设你有点比较)。在C++中,实际代码不是在运行时生成的,而是在编译时生成的,因此,如果您有一个带有模板的类,则必须在头文件中拥有它,或者必须实例化它存在的实例,否则您将(通常)得到链接错误,因为它找不到您要找的,因为它从来没有运行过。盟军制造。在做模板时,编译器实际上会制作模板类的“副本”,就像你实例化了不同类型的类一样。所以从STL,如果你有
这与使用引用的C语言(和Java Irc)中的泛型形成对比,并且只能使用指定的泛型从对象继承或从对象继承。您需要声明某个实现IComparable以使用其中的任何方法,或者您对它施加的任何其他限制。本质上,当您使用一个泛型时,它是确保类型安全的编译时技巧,但实际上并不在类中编译。C++是不同的,因为如果有一个带有模板字段的类,那么取决于该类的大小,结果类将更大或更小,这会影响对象的实际大小。 我希望这有点道理,尽管有点长。我真的不知道你能像MCH所显示的那样做模板化的函数。 |
![]() |
3
3
您得到的错误可能是由于示例代码中的其他问题造成的。下面是一个使用g++编译良好的模板化成员和自由函数的示例。
在C++中,通常包括报头文件中模板类的声明和定义。这样做可以确保编译器为模板化函数或类生成代码,并在编译时填充特定的模板参数。 可以将声明放在头文件中,将定义放在cpp文件中。如果您有少量的已知类型要模板化,那么这就可以很好地工作。有必要使用预期的类型显式地实例化cpp文件中的类或函数,以便编译器能够正确生成代码。 头文件:
CPP文件:
|
![]() |
4
1
我认为,更新3和4会泄露,但如果不知道你的项目布局,就很难分辨出来。 如果您试图公开来自库的模板以便从其他位置调用,则必须 A:在库的头文件中包含模板定义 或 B:在库中显式地实例化模板代码,以便以后的代码将有一个要链接到的实现
我认为这应该解决问题。 |
![]() |
5
1
可能是那个
是否在.cpp文件中而不是调用文件中? 如果是这样,这将导致您的错误。实现必须与调用在同一编译单元(.cpp文件+其所有include)中可用。 所以通常模板实现放在声明所在的头文件中。 所以你应该检查一下这个。 |
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |