小编Ton*_*ony的帖子

C++模板,模糊重载

由于某种原因,我有两个类使用模板实现运算符"+"(我这样做是因为我希望这两个类的所有子节点都能够使用它).

我已经找到了一个非常简单的代码来实现我想要使用的东西:

#include <type_traits>

class A{};

template<typename T>
A operator+(T& lhs,int rhs){
  static_assert(std::is_base_of<A, T>::value, "T must inherit from A");
  A to_return;
  return to_return;
}

class B{};

template<typename T>
B operator+(T& lhs,int rhs){
  static_assert(std::is_base_of<B, T>::value, "T must inherit from B");
  B to_return;
  return to_return;
}


int main()
{
  A u;
  A v = u+1;
}
Run Code Online (Sandbox Code Playgroud)

编译时,编译器(g ++或intel)返回以下错误:

  • g ++:main.cpp:25:11:错误:'u + 1'main.cpp中的'operator +'的模糊重载:25:11:注意:候选者是:main.cpp:6:3:注意:运算符+( T&,int)[with T = A] main.cpp:15:3:注意:B运算符+(T&,int)[T = A]

  • icpc:main.cpp(25):错误:多个运算符"+"匹配这些操作数:函数模板"运算符+(T&,int)"函数模板"B运算符+(T&,int)"操作数类型是: A + int A v = u + 1; ^

虽然它不是那么模糊,因为v应该是A类型,所以只有第一个模板才能工作. …

c++ inheritance templates operator-overloading c++11

3
推荐指数
1
解决办法
1119
查看次数