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

GCC 4.0:模板函数中"没有匹配的函数调用"

如何解决《GCC4.0:模板函数中"没有匹配的函数调用"》经验,为你挑选了2个好方法。

我想知道为什么以下设计的示例代码在Visual Studio 2005中完美运行,但在GCC中生成错误("调用Interpolate()时没有匹配的函数调用",如下所示).

另外,我该如何解决这个问题?似乎错误消息只是一个通用消息,因为GCC没有针对问题的实际原因的更具体的消息,它必须输出一些东西.我有点不知道如何在没有一些非常难看的变通方法的情况下继续移植这个类.

namespace Geo
{
    template 
    class TMyPointTemplate
    {
        T X,Y;
    public:
        inline TMyPointTemplate(): X(0), Y(0) {}
        inline TMyPointTemplate(T _X,T _Y): X(_X), Y(_Y) {}
        inline T GetX ()const { return X; }
        inline T GetY ()const { return Y; }
        //...
        template TMyPointTemplate Interpolate(const TMyPointTemplate &OtherPoint)const
        {
            return TMyPointTemplate((X+OtherPoint.GetX())/2,(Y+OtherPoint.GetY())/2);
        }           
    };
    typedef TMyPointTemplate IntegerPoint;
}

Geo::IntegerPoint Point1(0,0);
Geo::IntegerPoint Point2(10,10);
Geo::IntegerPoint Point3=Point1.Interpolate(Point2); //GCC PRODUCES ERROR: no matching function for call to 'Geo::TMyPointTemplate::Interpolate(Geo::IntegerPoint&)'

谢谢你的帮助,

阿德里安



1> Evan Teran..:

我认为在函数定义中根本不需要模板,因为它是与类内联定义的

TMyPointTemplate Interpolate(const TMyPointTemplate &OtherPoint)const {

应该做.

当你使用模板来定义不内联的函数时,我认为你需要像这样的class关键字.

template // <- here
TMyPointTemplate TMyPointTemplate::Interpolate(const TMyPointTemplate &OtherPoint)const {



2> Richard Cord..:

Evan的回答解决了这个问题,但我认为解释原因可能有用.

如上所述,Interpolate是一个成员模板函数,带有一个未命名的"非类型模板参数"(而不是类型模板参数,几乎可以肯定你的意图).为了显示这一点,我们可以为该参数指定一个名称:

template TMyPointTemplate Interpolate
      (const TMyPointTemplate &OtherPoint)const

我们现在可以看到如何调用该函数,我们只需要为't'提供一个值:

Geo::IntegerPoint Point3=Point1.Interpolate <0> (Point2);

添加类型名称之前,"T"这里,将宣布它作为一个类型模板参数.但是,仅进行该更改将导致错误,因为标识符"T"已用于封闭类模板中的模板参数名称.我们必须更改成员函数模板的模板参数的名称:

template 
class TMyPointTemplate
{
public:
  //...
  template TMyPointTemplate Interpolate
                 (const TMyPointTemplate &OtherPoint) const
  {
    return ...;
  }                       
};

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