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

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). Хэши должны быть равны если сгенерированы из одного или равных (поэлементно) векторов. У кого какие мысли?... подробнее

Показать сообщение отдельно
avgoor
915 / 550 / 119
Регистрация: 05.12.2015
Сообщений: 1,531
17.07.2016, 16:29
Я протрезвел, продолжим
Цитата Сообщение от Nosey Посмотреть сообщение
Лучше ссылочкой на стандарт, это будет вах какая конфетка.
Так вы ж сами ее привели! Впрочем, еще одна понадобится:
14.2 Names of template specializations
1 A template specialization (14.7) can be referred to by a template-id:
simple-template-id:
template-name<template-argument-list opt>
template-id:
simple-template-id
operator-function-id<template-argument-list opt>
...
Сперва приведу код:
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
29
30
31
32
33
34
class A;
 
namespace Foo
{
    template<class T> void foo(A& a, T l, T r);
    void foo(A& a, int l, int r);
}
 
class A
{
    int a;
    friend void Foo::foo<int>(A&, int, int); // Friend declaration 1
    friend void Foo::foo(A&, int, int); // Friend declaration 2
};
 
namespace Foo
{
    template<class T>
    void foo(A& a, T l, T r)
    {
        a.a = l + r;
    }
    void foo(A& a, int l, int r)
    {
        a.a = l + r;
    }
}
 
int main()
{
    A a;
    Foo::foo(a, 1, 2); // Call 1
    Foo::foo<int>(a, 1, 2); // Call 2
}
Т.е. пункт 1:
— 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
относится к Friend declaration 1 (см. код) т.е. с явным указанием шаблона.

Второй и третий пункты:
— 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,
определяют последовательность, в которой ищутся имена, в случае если указано только имя (Friend declaration 2)
Тогда, если есть нешаблонная функция с таким именем - она друг. Потом ищется шаблон с таким именем. Если и он не найден - имя должно быть неквалифицированным, и оно объявляется/определяется во внешнем неймспейсе.

Соответственно: Friend declaration 2 - относится к void foo(), а если ее закомментировать - будет относится к void foo<int>(). Как-то так.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru