Форум программистов, компьютерный форум 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... подробнее

Показать сообщение отдельно
Nosey
 Аватар для Nosey
1204 / 371 / 106
Регистрация: 22.10.2014
Сообщений: 813
Завершенные тесты: 2
16.07.2016, 15:35     Friend declaration construction
ASCII, Вместо правил книги, мне кажутся правила стандарта легче воспринимаются:

Цитата Сообщение от 14.5.4 Friends
— if the name of the friend is a qualified or unqualified template-id, the friend declaration refers to a
specialization of a function template, otherwise
— if the name of the friend is a qualified-id and a matching non-template function is found in the specified
class or namespace, the friend declaration refers to that function, otherwise,
— if the name of the friend is a qualified-id and a matching function template is found in the speci-
fied class or namespace, the friend declaration refers to the deduced specialization of that function
template (14.8.2.6), otherwise,
— the name shall be an unqualified-id that declares (or redeclares) an ordinary (non-template) function.
Все кроме 3-его правила , я например его не понимаю, и собственно это правило как раз разрешает ваше объявление
C++
1
friend void ::multiply(int);
На практике "это правило" не привязывает дружественность к специализации шаблона, а может привязать к общей шаблонной функции.
Т.е. ваше верхнее объявление привязывает дружественность к
C++
1
2
template <typename T>
void multiply(T) {// where T = int}
И кладет болт на специализацию.
Можно предположить что объявление специализации перед определением класса - решило бы проблему:
C++
1
2
3
4
5
6
7
8
template <typename T>
void multiply(T);
 
template <>
void multiply<int>(int);
// класс
 
// реализация специализации
но такого не происходит

Все это слишком похоже на баг, но вот проблема что этот баг одинаков на "всех" компиляторах .
Как расшифровывать 3-е правило я не понимаю.

Если мы определим дружественность таким образом:
C++
1
friend void ::multiply<>(int);
То мы попадем в первое правило, которое верно отрабатывает на "всех" компиляторах.

Цитата Сообщение от hoggy Посмотреть сообщение
если я правильно все понял,
то дружественные функции не могут быть квалифицированы.
(иметь полное имя)
Вам не кажется что это бред?
Ну и к тому же в стандарте приведен пример рассказывающий что относится к "инлайн" определению функции, аля :
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
 
class Pride
{
    friend void f() {std::cout << "Да, я в глобальном пространстве, и не смотрите где я написана" << std::endl;}
};
 
void f();
 
int main()
{
    f();
}
 
Текущее время: 06:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru