объявить функцию друга шаблон - PullRequest
0 голосов
/ 29 марта 2020

Этот вопрос частично основан на упражнении 15-4 в Ускоренное C ++ [1] и коде в этой книге. Я хочу объявить функцию myclone как друга класса, чтобы он имел доступ к закрытым членам. Функция myclone объявлена ​​как шаблон, но я не хочу предоставлять всем возможным функциям доступ к закрытым членам, только тем, которые связаны с этим классом.

class A{
    template <class T>
    friend T* myclone(const T*);

    A* clone() const {return new A(*this);}
}

какой-то другой файл:

template <class T>
T* myclone(const T* t) {return t->clone();}

Другая гипотетическая функция myclone может вызывать метод clone объекта A, но я хочу ограничить частный доступ A* myclone(const A*). Есть ли способ сделать это или я обдумываю это, и такая ситуация никогда не возникнет на практике? Должен ли я использовать шаблон специализации?

[1] Koenig, A., & Moo, BE (2000). Практическое программирование на C ++ на примере . Пирсон.

1 Ответ

0 голосов
/ 29 марта 2020

Вы не можете предоставить другу доступ только к некоторым вашим частным частям. Это все или ничего.

friend A* myclone(const A*); не работает, потому что такой функции нет. Шаблон не та функция, ни какая-то его специализация. Если вы хотите подружиться с определенной специализацией, просто скажите так:

template <class T> T* myclone(const T*); // needs to be declared first

class A {
   friend A* myclone<A>(const A*);
   ...
...