Как правильно использовать c ++ void_t? - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь попрактиковаться в использовании void_t, но следующий код выдает ошибку компиляции.is_fun - это typedef в CompS struct, поэтому я думаю, что Comp::is_fun должно быть допустимым.

Есть ли что-то, что я здесь пропустил?

template <typename T, typename Comp, typename = void_t<>>
class my_set
{
    public:
        my_set() : mem(5){}
        T mem;
};

template <typename T, typename Comp, void_t<typename Comp::is_fun> >
class my_set 
{
    public:
        my_set() : mem(10){}
        T mem;
};

struct CompS
{
    typedef int is_fun;
};

int main()
{
    my_set<int, CompS> a;
    std::cout << a.mem << std::endl;


    return 0;
}

Ошибка:

   voidt.cpp:17:38: error: ‘void’ is not a valid type for a template non-type parameter
     template <typename T, typename Comp, void_t<typename Comp::is_transparent> >
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    voidt.cpp:9:38: error: template parameter ‘class<template-parameter-1-3>’
     template <typename T, typename Comp, typename = void>
                                      ^~~~~~~~
    voidt.cpp:18:7: error: redeclared here as ‘<typeprefixerror><anonymous>’
     class my_set

1 Ответ

5 голосов
/ 26 сентября 2019

Вы пытаетесь объявить новый основной шаблон, но вам нужна специализация:

template <typename T, typename Comp>
class my_set<T, Comp, void_t<typename Comp::is_fun>>
{
    // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...