У меня есть шаблон Base
класс, который я хочу наследовать. Класс Base
имеет общедоступный метод, который делает допущение о типе шаблона. Упрощенная версия кода приведена ниже:Наследование класса шаблона в C++ с неподдерживаемым типом
#include <iostream>
using namespace std;
template <typename V>
class Base {
public:
virtual void print() {
a = "a";
cout << "Base class" ;
}
void callIt() {
print();
}
V a;
};
class Derived : public Base<int> {
public:
void print() override {
cout << "Derived class\n";
}
};
int main() {
Derived d;
d.callIt();
return 0;
}
Компиляция кода с GCC 6.2.0 дает мне эту ошибку:
test.cpp: In instantiation of 'void Base<V>::print() [with V = int]':
test.cpp:13:10: required from 'void Base<V>::callIt() [with V = int]'
test.cpp:28:12: required from here
test.cpp:9:7: error: invalid conversion from 'const char*' to 'int' [-fpermissive]
a = "a";
~~^~~~~
Я хочу, чтобы полностью скрыть реализацию Base
класса метода print()
из компилятора. Как я могу это сделать?
EDIT: Как ни странно, закомментировать строку a = "a";
позволяет код успешно компилируется и напечатает Derived class
.
Извините, почему 'Base :: print' делает предположение о' V', если 'Base' предназначен для наследования более общего шаблона? – Brian
@Brian 'Base' - это часть библиотеки, в которой я не контролирую ее, но мне нужны другие функции, которые она предоставляет. – Javad
Знаете ли вы, что на самом деле весело? Прокомментируйте 'a =" a ";' и посмотрите результат. http://melpon.org/wandbox/permlink/Kci1HFRYtKbtbLk8 (Предупреждение о спойлере: выход «Производный класс». Что?) –