J'ai une classe comme indiqué ci-dessous:instanciation de classe modèle imbriqué
template <class T>
class outer {
public:
typedef T TType;
std::vector <TType> v;
int f1 (TType t) {cout << "t= " << t << endl;};
class inner {
public:
inner& operator=(const inner &in) {return *this;}
void f2(const inner &in) {cout << "in f2\n";}
};
inner read() {cout << "in read\n";return inner();}
};
extérieur doit avoir niché inner
. Je dois créer une classe de base pour outer
(Nous revenons en arrière ici !!). Je devrais pouvoir dériver outer1
de la base. Les clients existants de outer
devraient fonctionner sans rien changer. outer
devrait simplement ajouter du code pour dériver de la classe de base.
Ma solution est:
template <typename T>
class outer_iface {
public:
typedef T TType;
std::vector <TType> v;
virtual int f1(TType t) {cout << "bt= " << t << endl;};
template <typename U>
class inner_iface {
public:
using value_type = U;
inner_iface& operator=(const inner_iface &in)
{
return static_cast <U*> (this)->operator=(in);
}
void f2(const inner_iface &in)
{
return static_cast <U*> (this)->f2(in);
}
}; //inner_biface
/*template <typename U>
typename inner_iface <U>::value_type read()
{
return static_cast <U*> (this)->read();
}*/
};
template <typename T>
class outer : public outer_iface <T> {
public:
typedef T TType;
std::vector <TType> v;
int f1 (TType t) {cout << "t= " << t << endl;};
class inner : public outer_iface <T> :: template inner_iface <inner> {
public:
inner& operator=(const inner &in) {return *this;}
void f2(const inner &in) {cout << "in f2\n";}
};
inner read() {cout << "in read\n";return inner();}
};
Ceci compile et construit. Mais, j'ai 2 questions:
- est ma déclaration/définition
read
correcteouter_iface
? - comment puis-je instancier un
outer_iface
, avec le typeint
, et appelerread
? J'ai essayé de
main()
:outer_iface<int> oi; oi.read();
clang a donné des erreurs:
g++ -g --std=c++11 test7.cpp
test7.cpp: In function ‘int main()’:
test7.cpp:62:11: error: no matching function for call to
‘outer_iface<int>::read()’oi.read();
^
test7.cpp:62:11: note: candidate is:
test7.cpp:28:40: note: template<class U> typename
outer_iface<T>::inner_iface<U>::value_type outer_iface<T>::read()
[with U = U; T = int]
typename inner_iface <U>::value_type read()
^
test7.cpp:28:40: note: template argument deduction/substitution failed:
test7.cpp:62:11: note: couldn't deduce template parameter ‘U’
oi.read();
Alors, évidemment, je ne l'ai pas droit. Comment puis-je corriger inner_face::read
? Toute aide/compréhension est appréciée. grâce sdp
Qu'est-ce que "outer1"? * S'il vous plaît * ne pas utiliser des noms extrêmement confus comme "verylongname" et "very1ongname" et "veryIongname1". Pouvons-nous simplement avoir "Foo" et "Bar"? –
Pourquoi introduire CRTP pour 'inner'? – Jarod42