Форум программистов, компьютерный форум CyberForum.ru

Friend declaration construction - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Работа с кодировками http://www.cyberforum.ru/cpp/thread1781380.html
Всем привет. Есть следующая проблема: есть программа, которая загружает html код страницы с сайта. Затем из этого html кода необходимо выдернуть все ссылки. Проблема заключается в том, что html документ может быть сохранен в любой кодировке. Поэтому, т.к. для себя я выбрал использовать utf-8, мне необходимо эти символы преобразовывать в utf-8. 1) Какие есть стандартные средства для...
C++ Развейте мои сомнения: упростится ли программирование при переходе от C к C++? Когда-то я уже начинал изучать C++, даже писал не большие программки на C++. Потом забросил и не кодил на C++ лет 8. Почти все забыл. Но тут возникла одна идея, которую нужно реализовать в виде программы и я решил тут «вспомнить молодость» и начать, что называется, «с нуля». Взял в руки книжку В.В. Подбельского «язык C++» 2005 года выпуска (знаю, что есть Страуструп, Липман и др. книжки посвежее... http://www.cyberforum.ru/cpp/thread1781376.html
C++ Сколько весит объект пустого класса
Господа, Создается пустой класс, скажем: class A { }; Потом объявляется переменная: A value; Вопрос: сколько value будет занимать места в куче (если она вообще там будет)?
Решение СЛАУ методом вращений (Якоби) - Рабочий метод C++
Есть этот код он рабочий, но надо коментарии повсюду, а я языка совсем не знаю, помогите кто может, зарание спасибо #include "stdafx.h" #include "stdio.h" #include <iostream> #include "math.h" const double PI = 3.1415926536; //метод поворотів якобі bool isSimmetrial( double **coefficients, int numberOfEquation ) {
C++ Вывести в консоль значение типа BYTE http://www.cyberforum.ru/cpp/thread1781333.html
COLORREF pix=GetPixel(hdc,0,0); BYTE b=GetGValue(pix); std::cout<<b<<std::endl; В консоль выводится какие-то знаки, а мне нужно получать значения от 0-255 как это сделать?
C++ Класс стек, наследованный от связного списка Как я понял из текста, что для методов isEmpty и print класса List нужен какой-то аргумент. Объясните пожалуйста, что такое -fpermissive. Ошибки: In member function 'int Stack<STACKTYPE>::isStackEmpty() const: 14 строка there are no arguments to 'isEmpty' that depend on a template parameter, so a declaration of 'isEmpty' must be available (if you use '-fpermissive', G++ will accept your... подробнее

Показать сообщение отдельно
ASCII
 Аватар для ASCII
87 / 59 / 9
Регистрация: 15.12.2013
Сообщений: 385
Завершенные тесты: 2

Friend declaration construction - C++

16.07.2016, 04:27. Просмотров 734. Ответов 36
Метки (Все метки)

Читаю C++ Templates. The Complete Guide. Вандервурд, Джоссатис
В одной из глав речь идет об объявлениях дружественных конструкций.

Основная идея такова:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename T1, typename T2>
void combine(T1, T2);
 
class Mixer
{
    friend void combine<>(int, int);
    friend void combine<int, int>(int, int);
    friend void combine<char>(char, int);
 
    // errors
    friend void combine<char>(char&, int);
    friend void combine<>(long, long) {  }
};
Можно объявить дружественной шаблон функции. Если можно вывести аргументы шаблона, угловые скобки могут быть пустыми.
Определение специализации шаблона запрещено.

Но говорится и о втором варианте объявления дружественных конструкций, в котором угловые скобки вообще опускаются.
В качестве пояснения, даются два правила:

1) Если имя не полное (без указания пространств имен или класса), то такое имя может ссылаться только на обычную функцию.
При этом, если в точке объявления функции в качестве дружественной она еще не была объявлена, то дружественная конструкция,
ее первое объявление, в таком случае оно может быть и определением.



2) Если имя полное (содержит :: ), то оно должно ссылаться на ранее объявленную функцию или шаблон функции.
Предпочтение отдается функции перед шаблоном функции. Не может быть определения.


Дается разъясняющий пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void multiply(void*);
 
template <typename T>
void multiply(T);
 
class Pride
{
public:
    friend void multiply(int) { }           /* имя не полное, может быть определением */
    friend void ::multiply(void*);        /* имя полное, ссылается на обычную функцию */
    friend void ::multiply(int);            /* имя полное, ссылается на шаблон функции для типа int */
    friend void ::multiply<double*>(double*); /* также могут быть и угловые скобки */
};
Проблема возникает для:

C++
1
    friend void ::multiply(int);  /* имя полное, ссылается на шаблон функции для типа int */
Если переписать этот пример вот так, для проверки дружественности специализации шаблона функции
multiply<int> классу Mixer:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void multiply(void*);
 
template <typename T>
void multiply(T);
 
class Pride
{
    int p;
public:
    friend void multiply(int) { }
    friend void ::multiply(void*);
    friend void ::multiply(int);
    friend void ::multiply<double*>(double*);
};
 
template <>
void multiply(double*)
{
    Pride pr;
    pr.p = 0; /* тут все нормально */
}
 
template <>
void multiply(int)
{
    Pride pr;
    pr.p = 0; /* а тут ошибка, то есть эта специализация не является дружественной */
}
Почему так?
Миниатюры
Friend declaration construction  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru