当前位置:  开发笔记 > 编程语言 > 正文

C++是否支持单个泛型方法而不是泛型类?

如何解决《C++是否支持单个泛型方法而不是泛型类?》经验,为你挑选了1个好方法。

是的,你非常接近,试试这个:

class FooBar1
{
public:
    template T 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 ...
    template T 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不起作用,只有当指针实际指向您要转换的类的实例时,才能使用它.(它与asC#中的运算符类似).

我现在怀疑,你想要的是CRTP.您从ImageFilter的实例开始,并希望在其上使用基类方法,并获取ImageFilter的新副本.尝试这些方面:

template 
class ImageMatrix
{
public:
    T GetRotatedMatrix()
    {
        return T();
    }
};

class ImageFilter : public ImageMatrix
{
};

int main()
{
    ImageFilter filterPrototype;
    ImageFilter otherFilter = filterPrototype.GetRotatedMatrix();
}

否则,如果您真的想从ImageMatrix开始并将其转换为ImageFilter,则必须在ImageFilter上添加一个构造函数,该构造函数采用ImageMatrix.



1> Eclipse..:

是的,你非常接近,试试这个:

class FooBar1
{
public:
    template T 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 ...
    template T 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不起作用,只有当指针实际指向您要转换的类的实例时,才能使用它.(它与asC#中的运算符类似).

我现在怀疑,你想要的是CRTP.您从ImageFilter的实例开始,并希望在其上使用基类方法,并获取ImageFilter的新副本.尝试这些方面:

template 
class ImageMatrix
{
public:
    T GetRotatedMatrix()
    {
        return T();
    }
};

class ImageFilter : public ImageMatrix
{
};

int main()
{
    ImageFilter filterPrototype;
    ImageFilter otherFilter = filterPrototype.GetRotatedMatrix();
}

否则,如果您真的想从ImageMatrix开始并将其转换为ImageFilter,则必须在ImageFilter上添加一个构造函数,该构造函数采用ImageMatrix.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有