C++ 尽管需要,但从未调用基类中的重载函数

C++ 尽管需要,但从未调用基类中的重载函数,c++,templates,inheritance,overloading,C++,Templates,Inheritance,Overloading,我正在尝试编写一个同时接受int和int的容器。 在一节课上做这件事很有效: template <class T> class unified_class { public: virtual void f(T &i){} virtual void f(T &&i) {} }; 模板 统一类 { 公众: 虚空f(T&i){} 虚空f(T&&i){} }; 电话: unified_class<int> u; u.f(8); // g

我正在尝试编写一个同时接受int和int的容器。 在一节课上做这件事很有效:

template <class T>
class unified_class
{
public:
    virtual void f(T &i){}
    virtual void f(T &&i) {}
};
模板
统一类
{
公众:
虚空f(T&i){}
虚空f(T&&i){}
};
电话:

unified_class<int> u;
u.f(8); // going to the second method
int a = 9;
u.f(a); // going to the first method
unified_class u;
u、 f(8);//转到第二种方法
INTA=9;
u、 f(a);//使用第一种方法
但当我试图将它分为两类时,一些奇怪的事情正在发生:

template <class T>
class base_class
{
public:
    virtual void f(T &&i) { /* it never reaches here*/}
};

template <class T>
class derived_class : public base_class<T>
{
public:
    using base_class<T>::f;
    virtual void f(T &i){}
};
模板
类基类
{
公众:
虚空f(T&&i){/*它永远不会到达这里*/}
};
模板
类派生的\u类:公共基类
{
公众:
使用基类::f;
虚空f(T&i){}
};
从前面调用相同的函数调用,在这两种情况下都会调用派生类的f()


我遗漏了什么吗?

我看不出g++4.6.3有什么问题。这是我使用的代码:

#include <iostream>

using std::cerr;

template <class T>
class base_class
{
public:
    virtual void f(T &&i) { cerr << "base_class\n"; }
};

template <class T>
class derived_class : public base_class<T>
{
public:
    using base_class<T>::f;
    virtual void f(T &i) { cerr << "derived_class\n";  }
};

int main(int argc,char **argv)
{
  derived_class<int> u;
  u.f(8); // going to the second method
  int a = 9;
  u.f(a); // going to the first method
}

我看不出g++4.6.3有什么问题。这是我使用的代码:

#include <iostream>

using std::cerr;

template <class T>
class base_class
{
public:
    virtual void f(T &&i) { cerr << "base_class\n"; }
};

template <class T>
class derived_class : public base_class<T>
{
public:
    using base_class<T>::f;
    virtual void f(T &i) { cerr << "derived_class\n";  }
};

int main(int argc,char **argv)
{
  derived_class<int> u;
  u.f(8); // going to the second method
  int a = 9;
  u.f(a); // going to the first method
}

如果你真的看到了你所发布的代码的结果,那么这肯定是一个编译器错误。当T为“int”时,不能用常量调用f(T&)。即使存在某种隐藏,而且我认为使用会解决这一问题,程序也应该完全无法编译,而不是调用错误的函数。

如果你真的看到了你所发布的代码的结果,那么这肯定是一个编译器错误。当T为“int”时,不能用常量调用f(T&)。即使存在某种类型的隐藏,我认为使用会解决这个问题,程序也应该完全无法编译,而不是调用错误的函数。

您使用的是Visual Studio 2010,它提供此功能作为临时绑定到非常量引用的扩展。这就是为什么它在这两种情况下都调用
T&
version。这个编译器扩展,如果有的话,应该被称为编译器bug,因为它取代了标准定义的行为


但是,在标准C++中,从积分文字<代码> 8 <代码>中创建的临时对象不能绑定到非const引用,因此,调用必须解析为以

T&
为参数的函数。

您正在使用Visual Studio 2010,它提供此功能作为临时绑定到非常量引用的扩展。这就是为什么它在这两种情况下都调用
T&
version。这个编译器扩展,如果有的话,应该被称为编译器bug,因为它取代了标准定义的行为


但是,在标准C++中,由积分文字<代码> 8 >代码>创建的临时对象不能绑定到非const引用,因此调用必须解析为以<代码> t&&< /C>为参数的函数。< /p>您使用什么编译器?我可以用GCC4.6.3编译。你用什么编译器?我使用GCC4.6.3编译得很好。使用Visual Studio运行代码时,我得到:派生类派生类使用Visual Studio运行代码时,我得到:派生类派生类派生类