(код упрощен для простоты) Я хочу создать тестовый класс с шаблоном 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;
}
Шаблоны классов не могут быть перегружены (шаблоны функций могут), а только специализированы. Если вы хотите частичная специализация, это должно быть
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 useTest
likeTest<int, std::string>
да. например
template <typename E>
class Test<E, std::string>
{
...
};
а также
template<typename E>
void Test<E, std::string>::Output()
{
...
}
Да, я знаю, что так можно сделать. Но что, если я хочу определить шаблон класса Test с двумя аргументами шаблона, такими как template <typename E, typename A>, а также специально определить методы для Test, класс с A имеет тип std :: string?
@CharlieLee Я не совсем понял твой вопрос. Вы имели в виду не частичную специализацию шаблона класса, а только частичную специализированную функцию-член?
Я имею в виду, могу ли я иметь шаблон класса: например, Test <E, A> (где E и A - оба шаблона), но тем временем определяют определенные функции, когда A - это std :: string
@CharlieLee Вы должны сделать какую-то специализацию, специализацию класса (как показал мой ответ) или специализацию функций-членов.
Я пробовал ваш код, но не получается, не могли бы вы опубликовать свой полный код в ответе?
К сожалению, вы не можете «перегрузить» шаблон класса, объявив 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);
по-прежнему будет работать.
Могу ли я установить второй шаблон как определенный тип данных (например, std :: string)? и используйте Test как Test <int, std :: string>