在依赖范围内调用静态函数模板

Ose*_*Ose 3 c++ generic-programming function-templates class-template

假设我template<int I> void ft()在结构模板中有一个静态函数模板template<bool B> S,我想ft从另一个函数模板调用template<bool B> void g(),将bool模板参数传递gS:

template<bool B>
struct S {
  static void f() {
  }
  template<int I>
  static void ft() {
  }
};

template<bool B>
void g() {
  S<B>::f();
  S<B>::ft<12>();
}

int main() {
  g<true>();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在GCC 4.5.2中进行编译会给出关于该行的两个错误S<B>::ft<12>():

  1. 在')'令牌之前预期的主要表达
  2. 类型'<unresolved overloaded function type>'和'int'到二进制'operator <'的无效操作数

Comeau(http://www.comeaucomputing.com/tryitout/),在严格的C++ 03模式下,也抱怨该行,说明"预期的表达式",在右括号下面有一个插入符号.S<B>::f()然而,编译器都没有抱怨该行,而且Comeau实际上可以在轻松模式下编译整个最小示例.

如果我删除了g模板,而是像这样实例化S模板参数g:

void g() {
  S<true>::ft<12>();
}

int main() {
  g();
  ...
Run Code Online (Sandbox Code Playgroud)

GCC成功编译它,Comeau在严格的C++ 03模式下也是如此.

从GCC上面的第二个错误来看,似乎在解释中存在歧义S<B>::ft<12>,好像它认为我试图测试是否S<B>::ft小于12.我知道使用typename来解决在提到时出现的歧义依赖范围内的类型.当依赖范围中出现的东西是函数而不是类型时,是否有人知道如何解决歧义?

mit*_*ull 6

您需要帮助编译器一点,告诉它ft是一个模板,如下所示:

template<bool B>
struct S {
  static void f() {
  }
  template<int I>
  static void ft() {
  }
};

template<bool B>
void g() {
  S<B>::f();
  S<B>::template ft<12>();
}

int main() {
  g<true>();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)