具有template <template>成员函数的C ++模板专业化

时间:2019-02-16 21:26:26

标签: c++ c++11 templates

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;
}

1 个答案:

答案 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>;

中再次使用模板参数