3

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

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

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

  1. ')' 标记之前的预期主表达式
  2. '<未解析的重载函数类型>'和'int'类型的无效操作数到二进制'operator<'

Comeau ( http://www.comeaucomputing.com/tryitout/ ),在严格的 C++03 模式下,也抱怨该行,指出"expected an expression",在右括号下方有一个插入符号。然而,这两个编译器都没有抱怨这条线S<B>::f(),Comeau 实际上可以在轻松模式下编译整个最小示例。

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

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

int main() {
  g();
  ...

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

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

4

1 回答 1

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;
}
于 2012-03-26T11:48:51.003 回答