Как исправить ошибку компиляции?
Error 1 **error C2912**: explicit specialization;
'void MyWriterExt::test(const MyType &)' is not a specialization of
a function template \testtemplate.cpp 30
Если вы хотите "специализацию" шаблонной функции в производном классе, решение должно быть (в производном классе):
- перегрузить шаблонную функцию обычной функцией для вашего параметра MyType
- «импортировать» шаблонную функцию в текущий класс (чтобы она не была скрыта при перегрузке)
Что дает:
class MyWriterExt : public MyWriter {
public:
/*
template<> void test(const MyType &val) {
test(val.a);
test(val.d);
}
*/
using MyWriter::test ;
void test(const MyType &val) {
test(val.a);
test(val.d);
}
};
Как правильно кодировать то, что вы хотите сделать?
Как расширить класс MyWriter для поддержки пользовательских классов?
Теперь, если вы используете MyWriter в качестве расширяемого потока вывода, я не уверен, что наследование - это решение.Как уже ответил Витаут на свой ответ ;Вы должны специализировать свою шаблонную функцию для (и вне) базового объекта.
Как правильно кодировать правильно, что вы хотите сделать?
Как сделатьЯ расширяю класс MyWriter для поддержки пользовательских классов?
Лучшим решением было бы следовать соглашению о потоке C ++, то есть использовать функции, не являющиеся членами, не являющимися членами.В вашем случае это будет что-то вроде:
class MyWriter {
public:
};
template<typename T>
MyWriter & operator << (MyWriter & writer, const T & val) {
std::cout << val << "\n";
return writer ;
}
Тогда любой может «специализировать» вашу функцию вывода без необходимости наследования:
MyWriter & operator << (MyWriter & writer, const MyType & val) {
writer << val.a << val.d ;
return writer ;
}
Что можно записать в вашей основной записи как:
int main() {
MyWriter w;
w << 10 << 9.999 << MyType(15, 0.25);
return 0;
}
Что, имхо, гораздо понятнее, чем накопление вызовов функций (если вы не выполняете форматирование, выходные потоки C ++ НАСТОЛЬКО просты в использовании).
(конечно, я предполагаю, что MyWriter сделает больше, чем простое перенаправление на std::cout
. Если нет, MyWriter бесполезен ...)