Форум программистов, компьютерный форум, киберфорум
Наши страницы

Friend declaration construction - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Какой паттерн подойдет, чтобы избежать длинных ветвлений? http://www.cyberforum.ru/cpp/thread1780896.html
здравствуйте, есть код схематично такой: class CTest_base { public: CTest_base() : vec() {} virtual ~CTest_base() noexcept {} //something else protected: std::vector<int> vec;...
C++ Что такое фреймворк? Доброго времени суток. Объясните пожалуйста на счет фреймворков. Несколько минут погуглив я примерно понял что это такое, но все же остались сомнения. В универе нам сказали писать программы в QT. При... http://www.cyberforum.ru/cpp/thread1780854.html
C++ Скорость или размер. Динамика
Есть ряд вопросов.. 1) Что быстрее считает процессор (соответственно с разрядностью). К примеру динамически создаётся массив. Из этого массива надо вычислить к примеру c=a+b. Если c = m и a = m, то...
C++ Существует ли какие-нибудь мета редакторы(авто дописывание кода)?
Всем доброго времени суток! Я решил оптимизировать свою работу и придумал следующую идею на основе авто кода в C++ XE3. Если в среде написать switch и следать пробел, то программа сама допишет то,...
C++ Таблица символов для компилятора http://www.cyberforum.ru/cpp/thread1778725.html
Делаю простой компилятор и что-то зависла на вопросе о том, как хорошо реализовать таблицу символов. Реализовать в виде класса, где в качестве поля используется, скажем, вектор, в который добавляются...
C++ Хэш код для нормализованного вектора Мне нужно генерировать 64-разрядный хэш для трехмерных нормализованных векторов (double). Хэши должны быть равны если сгенерированы из одного или равных (поэлементно) векторов. У кого какие мысли?... подробнее

Показать сообщение отдельно
Nosey
1349 / 400 / 107
Регистрация: 22.10.2014
Сообщений: 863
Завершенные тесты: 2
16.07.2016, 15:35
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();
}
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru