mercredi 24 juin 2020

deleted friend declaration declares a non-template function

I want to delete a specific overloaded friend function in a class.

The below code compiles, and works in the way intended. However, I get the following warning (g++, c++11,14,17):

warning: friend declaration 'bool operator==(const MyType<BaseT>&, const BaseT&)' declares a non-template function [-Wnon-template-friend]
    6 |   friend bool operator==(const MyType<BaseT> &lhs, const BaseT &rhs) = delete;
      |                                                                        ^~~~~~
new.cpp:6:72: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)

Can someone shed light on the warning? Why does it apply for the deleted function, but not the implemented one?

template <typename BaseT> struct MyType {
  BaseT v;
  explicit  MyType(BaseT tv) : v(tv) {}
  explicit  operator BaseT() const { return v; }

  friend bool operator==(const MyType<BaseT> &lhs, const BaseT &rhs) = delete;
  friend bool operator==(const MyType<BaseT> &lhs, const BaseT &&rhs) {
    return lhs.v == rhs;
  }
};

int main(){
    MyType<int> a{3};
    int b{3};
    // a==b; //Fails to compile: good. Do not allow comparisons between different types
    a==3;    //Compiles fine: good. Allow literal comparison, without implicit constructor
}

Aucun commentaire:

Enregistrer un commentaire