当out
成员函数(从模板和从专业化)都需要模板时,为什么c ++要求模板自变量,因为我没有得到,谷歌也没有帮助。必须为c ++ 11,但与c ++ 1z相同。
我正在使用g ++ 7.3.0
获取此错误消息:
error: missing template arguments before ‘>’ token
Tail::out<P>(o);//<--?!?!?!
#include <iostream>
using namespace std;
using Out=ostream;
struct O {};
template<typename O=O>
struct Static:public O {
template<const char** text>
struct Text {
static inline void print(Out& o) {o<<text[0];}
};
};
template<typename O>
struct Endl {
static inline void print(Out& o) {O::print(o);o<<endl;}
};
template<typename O,typename... OO>
struct MenuData {
using Head=O;
using Tail=MenuData<OO...>;
template<template<typename> class P>
static inline void out(Out& o) {
P<O>::print(o);
Tail::out<P>(o);//<--?!?!?!
}
};
template<typename O,typename OO>
struct MenuData<O,OO> {
using Head=O;
using Last=OO;
template<template<typename> class P>
static inline void out(Out& o) {P<O>::print(o);P<Last>::print(o);}
};
/////////////////////////////////////////////////////////
const char* op1Text="Op1";
using op1=Static<>::Text<&op1Text>;
const char* op2Text="Op2";
using op2=Static<>::Text<&op2Text>;
const char* op3Text="Op3";
using op3=Static<>::Text<&op3Text>;
using MainMenu=MenuData<op1,op2,op3,op1>;
int main(int argc,char** argv) {
MainMenu::out<Endl>(cout);
cout<<endl;
}
答案 0 :(得分:0)
在下面的代码之后,我发现了一个很好的问题/答案,可以清楚地了解
Where and why do I have to put the "template" and "typename" keywords?
在经过数小时的测试和检查后,仍然可以正常工作,但我仍然不满意,这应该更简单,因此,如果有人有更好的解决方案,我将很乐意接受,而且我仍然不明白为什么第一个版本不被接受...
此版本可以编译并打印所需的结果,我将继续简单地进行
{ details: (combinedResult$ | async ) }
关键点:
#include <iostream>
using namespace std;
using Out=ostream;
struct O {};
template<typename O=O>
struct Static:public O {
template<const char** text>
struct Text {
static inline void print(Out& o) {o<<text[0];}
};
};
template<typename O>
struct Endl {
static inline void print(Out& o) {O::print(o);o<<endl;}
};
template<typename O,typename... OO>
struct MenuData {
// using Head=O;
// using Tail=MenuData<OO...>;
template<template<typename> class P>
using X=typename MenuData<OO...>::template OutData<P>;
template<template<typename> class P>
struct OutData {
static inline void out(Out& o) {
P<O>::print(o);
X<P>::out(o);//<--?!?!?!
};
};
};
template<typename O,typename OO>
struct MenuData<O,OO> {
// using Head=O;
// using Last=OO;
template<template<typename> class P>
struct OutData {
static inline void out(Out& o) {
P<O>::print(o);
P<OO>::print(o);
}
};
};
/////////////////////////////////////////////////////////
const char* op1Text="Op1";
using op1=Static<>::Text<&op1Text>;
const char* op2Text="Op2";
using op2=Static<>::Text<&op2Text>;
const char* op3Text="Op3";
using op3=Static<>::Text<&op3Text>;
using MainMenu=MenuData<op1,op2,op3,op1>;
int main(int argc,char** argv) {
MainMenu::OutData<Endl>::out(cout);
cout<<endl;
}
所以我不得不再说一遍明显的东西,告诉它它是一个模板
,但在template<template<typename> class P>
using X=typename MenuData<OO...>::template OutData<P>;