#include <iostream>

using namespace std;

template <typename T> class Coor;
template <typename T> T getX(const Coor<T>& c);
template <typename T> T getY(const Coor<T>& c);

template <typename T>
class Coor {
    friend T getX<>(const Coor<T>& c);
    friend T getY<>(const Coor<T>& c);
  private:
    T x;
    T y;
  public:
    Coor(const T& a, const T& b) : x(a), y(b) {}
};

template <typename T>
T getX(const Coor<T>& c) {
    return c.x;
}

template <typename T>
T getY(const Coor<T>& c) {
    return c.y;
}

int main() {
    Coor<int> coor(0, 1);
    Coor<double> dcoor(0.123, 12.345);
    cout << getX(coor) << ", " << getY(coor) << endl;
    cout << getX(dcoor) << ", " << getY(dcoor) << endl;
    return 0;
}