继承和模板运算符重载
我不明白为什么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>
答案 0 :(得分:3)
派生类中运算符的声明隐藏了基类中的名称
要解决问题,这是using declaration
:
template <>
struct A<int>: public base {
using base::operator();
void operator()() { std::cout << "A<int>" << std::endl; }
};
他们两个都会编译。