Шаблонная специализация класса с несколькими аргументами, где один аргумент шаблона является самим шаблоном - PullRequest
2 голосов
/ 23 января 2020

Я думаю, что проще всего показать код:

template<typename T>
struct TemplateTest { //<-- generic version
    using typeGeneric = int;
};
template<>
struct TemplateTest<std::vector<int>> { //<-- specialized with specialized version of vector
    using typeVectorInt = int;
};
template<typename T>
struct TemplateTest<std::vector<T>> { //<-- specialized with generic version of vector
    using typeVectorT = int;
};

int main (int argc, char** argv) {
    typename TemplateTest<int>::typeGeneric var1;
    typename TemplateTest<std::vector<int>>::typeVectorInt var2;
    typename TemplateTest<std::vector<char>>::typeVectorT var3;
    return 0;
}

Это работает нормально и, как и ожидалось. Поскольку я использовал разные имена-использования в разных специализациях, возникнет ошибка компиляции, если во время компиляции будет выбрана непредвиденная специализация. (Я сделал это только для этого поста, чтобы показать проблему)

Однако это не работает должным образом:

template<typename Tfirst, typename Tsecond>
struct TemplateTest { //<-- generic version
    using typeGeneric = int;
};
template<typename Tfirst>
struct TemplateTest<Tfirst, std::vector<int>> { //<-- specialized with specialized version of vector
    using typeVectorInt = int;
};
template<typename Tfirst>
template<typename T>
struct TemplateTest<Tfirst, std::vector<T>> { //<-- specialized with generic version of vector
    using typeVectorT = int;
};

int main (int argc, char** argv) {
    typename TemplateTest<int, int>::typeGeneric var1;
    typename TemplateTest<int, std::vector<int>>::typeVectorInt var2;
    typename TemplateTest<int, std::vector<char>>::typeVectorT var3;
    return 0;
}

var3 - проблема. Векторная специализация не работает (не выбрана компилятором), и я не знаю почему. Можно ли это сделать, и если да, то как?

Спасибо!

1 Ответ

2 голосов
/ 23 января 2020

Вы объявляете 2-ю специализацию в неправильном синтаксисе (с посторонним списком параметров шаблона); измените его на

template<typename Tfirst, typename T>
struct TemplateTest<Tfirst, std::vector<T>> { //<-- specialized with generic version of vector
    using typeVectorT = int;
};
...