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

c++ template specialization with template<template> member function

本文关键字:gt lt template C++ 成员 函数 专用      更新时间:2023-10-16

当两个 out成员函数(来自模板和专业化)都需要模板时,为什么C 需要模板参数,因为我没有得到它,而Google也没有帮助。必须是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;
}

代码bellow之后,我发现了这个很好的问题/答案,它揭示了

我必须在何处以及为什么要放置"模板"answers" typename"关键字?

经过多个小时的测试和检查,我不高兴,这应该更简单,因此,如果有人有更好的解决方案,我很乐意接受它,我仍然不明白为什么第一个版本不接受...

此版本编译并打印所需的结果,我将继续进行

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

所以我不得不再次说出它是一个模板

但是在X<P>::out(o);//<--?!?!?!

中再次使用模板参数