проблемы с именем для пространства имен и параметров шаблона - PullRequest
3 голосов
/ 02 октября 2019

Недавно я прочитал некоторый код о websocketpp, и меня смущает следующий код:

#include <somefile.hpp>
template <typename config>
class endpoint : public config::socket_type {          //--------A--------//
    typedef typename config::concurrency_type concurrency_type;//-----B------//
    ....
}

В файле somefile.hpp есть пространство имен, которое также называется config. Так что я не знаю, обозначало ли имя «config» в A и B это пространство имен или параметр шаблона. Я предполагаю, что это параметр шаблона.

Спасибо всем, кто задает мои вопросы.

1 Ответ

2 голосов
/ 02 октября 2019

Имя параметра шаблона вводится в область первичного объявления шаблона. Он скрывает имя пространства имен.

Из стандарта C ++ 17 (6.3.2 Точка объявления)

11 Точка объявления для параметра шаблона находится сразу после его завершенияпараметр-шаблона

С условием require объявление шаблона может выглядеть более понятным.

Вот демонстрационная программа

namespace config
{
}

template <typename config> requires requires { typename config::socket_type; }
class endpoint : public config::socket_type
{
};

struct A
{
    struct socket_type {};
};

int main()
{
    endpoint<A> e;
}    
...