Класс шаблона для определенного типа данных

(код упрощен для простоты) Я хочу создать тестовый класс с шаблоном E A, а также тестовый класс только с шаблоном E. Когда я сделал это и попытался скомпилировать свой код, я получил следующие ошибки:

error C2976: 'Test': too few template arguments

note: see declaration of 'Test'

error C2244: 'Test::Output': unable to match function definition to an existing declaration

error C2662: 'void Test::Output(void)': cannot convert 'this' pointer from 'Test' to 'Test &'

error C2514: 'Test': class has no constructors

#include <iostream>
#include <string>
template <typename E, typename A>
class Test
{
public:
    Test(E *e = nullptr, A *a = nullptr) : a(e), b(a) {}
    void Output();

private:
    E * a;
    A *b;
};
template <typename E, typename A>
void Test<E, A>::Output()
{
    std::cout << " " << *a << " " << *b;
}

template <typename E>
class Test
{
public:
    Test(E *e = nullptr, std::string *a = nullptr) : a(e), b(a) {}
    void Output();

private:
    E * a;
    std::string *b;
};

template<typename E>
void Test<E>::Output()
{
    std::cout << *a << *b;
}
int main()
{
    int a = 10;
    std::string str = "hi";

    Test<int> t(&a, &str);
    t.Output();
    return 0;
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
636
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Шаблоны классов не могут быть перегружены (шаблоны функций могут), а только специализированы. Если вы хотите частичная специализация, это должно быть

template <typename E>
class Test<E, E>
{
    ...
};

а также

template<typename E>
void Test<E, E>::Output()
{
    ...
}

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

Test<int, int> t(&a, &str); // the partial specialization will be used

РЕДАКТИРОВАТЬ

Can I set the second template as a specific data type (such as std::string)? and use Test like Test<int, std::string>

да. например

template <typename E>
class Test<E, std::string>
{
    ...
};

а также

template<typename E>
void Test<E, std::string>::Output()
{
    ...
}

ЖИТЬ

Могу ли я установить второй шаблон как определенный тип данных (например, std :: string)? и используйте Test как Test <int, std :: string>

Charlie Lee 27.10.2018 16:55

Да, я знаю, что так можно сделать. Но что, если я хочу определить шаблон класса Test с двумя аргументами шаблона, такими как template <typename E, typename A>, а также специально определить методы для Test, класс с A имеет тип std :: string?

Charlie Lee 27.10.2018 17:36

@CharlieLee Я не совсем понял твой вопрос. Вы имели в виду не частичную специализацию шаблона класса, а только частичную специализированную функцию-член?

songyuanyao 27.10.2018 17:42

Я имею в виду, могу ли я иметь шаблон класса: например, Test <E, A> (где E и A - оба шаблона), но тем временем определяют определенные функции, когда A - это std :: string

Charlie Lee 28.10.2018 02:36

@CharlieLee Вы должны сделать какую-то специализацию, специализацию класса (как показал мой ответ) или специализацию функций-членов.

songyuanyao 28.10.2018 06:18

Я пробовал ваш код, но не получается, не могли бы вы опубликовать свой полный код в ответе?

Charlie Lee 28.10.2018 10:22

К сожалению, вы не можете «перегрузить» шаблон класса, объявив template typename E> class Test. Класс Test должен принимать два параметра шаблона.

Решением здесь было бы объявить совершенно другой класс шаблона или сделать второй параметр шаблона необязательным и написать специализацию шаблона:

class Dummy;
template <typename E, typename A = Dummy>
class Test
…

template <typename E>
class Test<E, Dummy>

Так что синтаксис Test<int> t(&a, &str); по-прежнему будет работать.

Другие вопросы по теме