template pour du traitement de donnée. erreur de compilation.
Bonjour,
J'ai un souci et je ne sais pas trop comment m'en sortir. J'aimerais faire un template pour traiter des données. Voici un code minimal ci-dessous.
Cela marche très bien si P est directement une classe. Mais je voudrais aussi pouvoir utiliser P comme un pointeur de classe (voir main).
Comment dois-je ecrire la fonction process pour que ce template fonctionne dans les deux cas ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <iostream>
#include <vector>
template<typename T, typename P> class DataProcessor {
P mProcessor;
std::vector<T> mData;
public:
void push_back(const T& data) {
mData.push_back(data);
}
void set(const P& processor) {
mProcessor = processor;
}
P& get() {
return mProcessor;
}
void process() {
for (typename std::vector<T>::iterator it = mData.begin(); it != mData.end(); ++it) {
mProcessor.process(*it);
}
}
};
class PrintData {
std::string mPrefix;
public:
void prefix(std::string prefix) {
mPrefix = prefix;
}
void process(int i) {
std::cout<<mPrefix<<" : "<<i<<std::endl;
}
};
int main() {
DataProcessor<int, PrintData> p1;
p1.get().prefix("prefix");
p1.push_back(1);
p1.push_back(2);
p1.push_back(3);
p1.process();
PrintData* pdata = new PrintData;
pdata->prefix("prefix");
DataProcessor<int, PrintData*> p2;
p2.set(pdata);
p2.push_back(1);
p2.push_back(2);
p2.push_back(3);
p2.process();
} |
Voici l'erreur de compilation :
Code:
1 2 3 4
| $ g++ -o main main.cc
main.cc: In member function void DataProcessor<T, P>::process() [with T = int, P = PrintData*]:
main.cc:56: instantiated from here
main.cc:23: error: request for member process in ((DataProcessor<int, PrintData*>*)this)->DataProcessor<int, PrintData*>::mProcessor, which is of non-class type PrintData* |