我有一個模板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()
方法來自編譯器。我怎樣才能做到這一點?
編輯︰諷刺的是,註釋行a = "a";
允許代碼編譯成功,並將打印出Derived class
。
對不起,爲什麼'Base :: print'會假設'V'是否'Base'被更普遍的模板所繼承? – Brian
@Brian'Base'是一個庫的一部分,我無法控制它,但我想要它提供的其他功能。 – Javad
你知道什麼真的很有趣嗎?註釋掉'a =「a」;'並查看輸出。 http://melpon.org/wandbox/permlink/Kci1HFRYtKbtbLk8 (擾流警報:輸出是'Derived class'。什麼?) –