clang: шаблон кандидата игнорируется: ошибка замещения: typedef 'type' нельзя ссылаться с помощью спецификатора класса - PullRequest
0 голосов
/ 16 января 2019

В отличие от GCC 5, Clang 6 жалуется на следующую ошибку:

шаблон кандидата игнорируется: ошибка замещения [с U = char, Us =]: на typedef 'type' нельзя ссылаться с помощью спецификатора класса Кортеж (U && u, Us && ... rest): m_element (:: std :: forward (u)), m_rest (:: std :: forward (rest ...) ...)

Я использую свою собственную реализацию Tuple с

//! Declaration of tuple typename with multiple elements
template<typename T, typename... Ts>
class Tuple<T, Ts...>
{
public:
    T m_element;
    Tuple<Ts...> m_rest;

    template<typename U,
             typename... Us,
             typename = class ::std::enable_if<!::std::is_base_of<Tuple,typename ::std::decay<U>::type>::value>::type>
    Tuple(U&& u, Us&&... rest) : m_element(::std::forward<U>(u)), m_rest(::std::forward<Us>(rest)...)
    {
    }
};

template<typename... Ts>
Tuple<typename ::std::decay<Ts>::type...> make_tuple(Ts&&... elements)
{
    return Tuple<typename ::std::decay<Ts>::type...>(::std::forward<Ts>(elements)...);
}

Что Clang делает иначе, чем GCC? И как я могу это исправить?

Спасибо!

1 Ответ

0 голосов
/ 16 января 2019

Что Clang делает по-другому, чем GCC? И как я могу это исправить?

Не уверен, кто прав, и не уверен, что это решит вашу проблему (без минимального, но полного примера вашей проблемы, я не могу это проверить), но у меня есть ошибка (только clang ++), которая исчезает, когда я изменяю class с typename

Так что я предлагаю

template<typename U,
         typename... Us,
         // ........VVVVVVVV  <--- "typename" here, not "class"
         typename = typename ::std::enable_if<!::std::is_base_of<Tuple,typename ::std::decay<U>::type>::value>::type>
Tuple(U&& u, Us&&... rest) : m_element(::std::forward<U>(u)), 
                             m_rest(::std::forward<Us>(rest)...)
 { }
...