私はテンプレートを継承したいBase
クラスがあります。 Base
クラスには、テンプレート型についての前提となるpublicメソッドがあります。コードの簡略版は以下の通りである:GCC 6.2.0でこのコードをコンパイルサポートされていないタイプの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;
}
は私に、このエラーを与える:
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";
~~^~~~~
私は完全にprint()
方法のBase
クラスの実装を非表示にしますコンパイラから。どうやってやるの?
EDIT:皮肉なことに、ラインa = "a";
をコメントアウトすると、コードが正常にコンパイルできるようにするとDerived class
を出力します。
なぜなら、 'Base ::'がより一般的なテンプレートに継承されることを意図している場合、 'Base :: print'は' V'についての仮定をしていますか? – Brian
@Brian 'Base'は私がそれを制御できないライブラリの一部ですが、私はそれが提供する他の機能を望んでいます。 – Javad
本当に楽しいことが分かりますか? 'a =" a ";'をコメントアウトし、出力を参照してください。 http://melpon.org/wandbox/permlink/Kci1HFRYtKbtbLk8 (Spoiler alert:出力は 'Derived class'とは何ですか?) –