С моим незнанием С++ видно, что ответ не очень.
Извините, вы меня хотите проэкзаменовать?
Не размещать несколько разнородных вопросов в рамках одного вопроса.
auto
во втором случае? конструктор копирования должен вызываться при копирующей инициализации
fillArray
. :)a
прямо из main
, после чего код fillArray
выполняет ряд описанных в нем присвоений.return
в fillArray
становится фиктивен, а локальная переменная выпадает из кода за ненадобностью.struct Pointer;
- это предварительное объявление структуры в пространстве имен типа Holder
.friend struct Pointer;
- тут нужно проявить внимательность.The name of the class that is used in this friend declaration does not need to be previously declared.
When a local class declares an unqualified function or class as a friend, only functions and classes in the innermost non-class scope are looked up, not the global functions
Pointer
будет произведено в том пространстве имен, где определен тип Holder
, а не в его пространстве имен.Holder::Pointer
, требуется сперва сделать предварительное объявление структуры Pointer
в пространстве Holder
.friend Pointer;
чтобы использовать уже объявленное имя вместо создания предварительного объявления этого имени.struct
в строке friend struct Pointer;
. Да и то только если ты пользуешься C++11.Структура, объявленная как вложенная, не получает автоматического доступа
к закрытым членам внешней структуры.
Like any member of its enclosing class, the nested class has access to all names (private, protected, etc) to which the enclosing class has access ...
Pointer
, так и объявление его дружественности. С поправкой, конечно, на C++11. // r2 += "!"; // error: cannot modify through reference to const
...
const std::string& r2 = s1 + s1; // okay: lvalue reference to const extends lifetime
...
std::cout << "lvalue reference to const overload f(" << x << ")\n";
...
Note that rvalue references and lvalue references to const extend the lifetimes of temporary objects
For any type T (including incomplete types), other than function type or reference type ...
References and pointers to cv-qualified types may be implicitly converted to references and pointers to more cv-qualified types.
Тебе нужно предоставить примеры. Объявить шаблон другом - легко. Только если сделать это в лоб, то тогда дружественными будут все инстанцированные из шаблона функции. Я не думаю что тебе нужно именно это.
Поэтому сперва покажи код, на его базе можно будет дать тебе более точные рекомендации.
Знания не берутся из воздуха, знания берутся из источников знаний.
Какие причины ты видишь в том чтобы запретить определение шаблонов методов или статических функций в пространстве классов?