是的,你非常接近,试试这个:
class FooBar1 { public: templateT Foo(); }; class FooBar2 : public FooBar1 { }; template T FooBar1::Foo() { return T(); } int main() { FooBar1 fb1; FooBar2 fb2 = fb1.Foo (); }
您遇到的问题是您指定的返回类型为FooBar1::Foo()
as FooBar2
,您应该将其设置为just T
.
如果你想为FooBar2做特定的事情,你可以专门研究FooBar2:
template<> FooBar2 FooBar1::Foo() { return FooBar2(); }
编辑:听起来你在编译器没有找到模板化GetRotatedCopy的定义时遇到问题.C++中的模板相当挑剔,通常的做法是将整个模板实现放在头文件中.你可以试试这个:
class ImageMatrix : public VImage { public: // ... various functions ... templateT GetRotatedCopy(VDouble angle) { // ... create a new instance of ImageMatrix and return it. } };
编辑:我找不到gcc文档,但这里是microsoft关于显式模板实例化和库的文档,它给出了一些关于发生了什么的想法.您可能希望按照我之前的建议在头中包含实现,或者在库中调用GetRotatedCopy,或者在库中显式实例化它.有关语法,请参阅下面的veefu答案.
这与C#的不同之处在于,与C#不同,C++中的模板实际上为每个不同的模板参数组合创建了一个全新的类/函数.例如,vector
是一个完全不同的类(使用不同的编译方法集)vector
.请参阅凯文的答案以获得更好的解释.
至于当你不使用模板时错误消失,这实际上并没有告诉你多少,因为直到你实际实例化一个模板,它不会
RE更新5,6,7
您的dynamic_cast不起作用,只有当指针实际指向您要转换的类的实例时,才能使用它.(它与as
C#中的运算符类似).
我现在怀疑,你想要的是CRTP.您从ImageFilter的实例开始,并希望在其上使用基类方法,并获取ImageFilter的新副本.尝试这些方面:
templateclass ImageMatrix { public: T GetRotatedMatrix() { return T(); } }; class ImageFilter : public ImageMatrix { }; int main() { ImageFilter filterPrototype; ImageFilter otherFilter = filterPrototype.GetRotatedMatrix(); }
否则,如果您真的想从ImageMatrix开始并将其转换为ImageFilter,则必须在ImageFilter上添加一个构造函数,该构造函数采用ImageMatrix.
是的,你非常接近,试试这个:
class FooBar1 { public: templateT Foo(); }; class FooBar2 : public FooBar1 { }; template T FooBar1::Foo() { return T(); } int main() { FooBar1 fb1; FooBar2 fb2 = fb1.Foo (); }
您遇到的问题是您指定的返回类型为FooBar1::Foo()
as FooBar2
,您应该将其设置为just T
.
如果你想为FooBar2做特定的事情,你可以专门研究FooBar2:
template<> FooBar2 FooBar1::Foo() { return FooBar2(); }
编辑:听起来你在编译器没有找到模板化GetRotatedCopy的定义时遇到问题.C++中的模板相当挑剔,通常的做法是将整个模板实现放在头文件中.你可以试试这个:
class ImageMatrix : public VImage { public: // ... various functions ... templateT GetRotatedCopy(VDouble angle) { // ... create a new instance of ImageMatrix and return it. } };
编辑:我找不到gcc文档,但这里是microsoft关于显式模板实例化和库的文档,它给出了一些关于发生了什么的想法.您可能希望按照我之前的建议在头中包含实现,或者在库中调用GetRotatedCopy,或者在库中显式实例化它.有关语法,请参阅下面的veefu答案.
这与C#的不同之处在于,与C#不同,C++中的模板实际上为每个不同的模板参数组合创建了一个全新的类/函数.例如,vector
是一个完全不同的类(使用不同的编译方法集)vector
.请参阅凯文的答案以获得更好的解释.
至于当你不使用模板时错误消失,这实际上并没有告诉你多少,因为直到你实际实例化一个模板,它不会
RE更新5,6,7
您的dynamic_cast不起作用,只有当指针实际指向您要转换的类的实例时,才能使用它.(它与as
C#中的运算符类似).
我现在怀疑,你想要的是CRTP.您从ImageFilter的实例开始,并希望在其上使用基类方法,并获取ImageFilter的新副本.尝试这些方面:
templateclass ImageMatrix { public: T GetRotatedMatrix() { return T(); } }; class ImageFilter : public ImageMatrix { }; int main() { ImageFilter filterPrototype; ImageFilter otherFilter = filterPrototype.GetRotatedMatrix(); }
否则,如果您真的想从ImageMatrix开始并将其转换为ImageFilter,则必须在ImageFilter上添加一个构造函数,该构造函数采用ImageMatrix.