继承和模板运算符重载

时间:2016-06-15 21:35:30

标签: c++ templates inheritance operator-overloading

继承和模板运算符重载

我不明白为什么A<int>中的运算符会掩盖base中的运算符。 毕竟它有不同的签名。

#include <iostream>

struct base {
  template <typename U>
  void operator()(U&& x) { std::cout << "base" << std::endl; }
};

template <typename T>
struct A: public base { };

template <>
struct A<int>: public base {
  void operator()() { std::cout << "A<int>" << std::endl; } // line 1
};

int main()
{
  A<double>()(1);
  A<int>()(1); // line 2
  A<int>()();  // line 3
}

如果第1行存在,则第2行无法编译。

如果删除第1行(显然),则第3行不会编译。

如果我将操作员模板从base复制到A,一切正常。

我希望输出为:

base
base
A<int>

1 个答案:

答案 0 :(得分:3)

派生类中运算符的声明隐藏了基类中的名称 要解决问题,这是using declaration

的问题
template <>
struct A<int>: public base {
    using base::operator();
    void operator()() { std::cout << "A<int>" << std::endl; }
};

他们两个都会编译。