шаблон класса для конкретного типа данных - PullRequest
0 голосов
/ 27 октября 2018

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

ошибка C2976: «Тест»: слишком мало аргументов шаблона

примечание: см. Объявление 'Test '

ошибка C2244: «Test :: Output»: невозможно сопоставить определение функции с существующим объявлением

ошибка C2662: «void Test :: Output (void)»: невозможно преобразовать »этот 'указатель с' Test 'на' Test & '

ошибка C2514:' Test ': класс не имеет конструкторов

#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;
}

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

К сожалению, вы не можете «перегрузить» шаблон класса, объявив 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); все равно будет работать.

0 голосов
/ 27 октября 2018

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

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

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

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

Да.например,

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

и

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

LIVE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...