0

Templates are making things so hard. I haven't got the syntax right, I've been trying for ages. I have a function called "createSphere" in a class called "ModelMngr" that I would like to be a friend of another class.

class ModelMngr
{public:
template <typename T_scalar>
    static Sphere<T_scalar>* createSphere(T_scalar radius, int sides, int heightSegments, const String& name = "Sphere Primitive Mesh");
}

template <typename T_scalar>
class Sphere : public MeshBaseClass<T_scalar>
{public:
        template <typename T> friend Sphere<T>* ModelMngr::createSphere(T radius, int sides, int heightSegments, const String& name = "Sphere Primitive Mesh");


}

I changed the T_scalar in the friend declaration to T because I was worried there would be a name conflict with the template argument of the enclosing class. Is there any conflict?

Zebrafish
  • 11,682
  • 3
  • 43
  • 119

1 Answers1

3

Forward declare Sphere, remove the default arguments from friend declaration and add semicolons after class definitions:

template <typename T_scalar>
class Sphere;

class ModelMngr {
public:
  template <typename T_scalar>
  static Sphere<T_scalar> *
  createSphere(T_scalar radius, int sides, int heightSegments,
               const String& name = "Sphere Primitive Mesh");
};

template <typename T_scalar>
class Sphere : public MeshBaseClass<T_scalar> {
public:
  template <typename T>
  friend Sphere<T> *
  ModelMngr::createSphere(T radius, int sides, int heightSegments,
                          const String &name);
};
Aykhan Hagverdili
  • 28,141
  • 6
  • 41
  • 93