【问题标题】:Calling static function template within dependent scope在依赖范围内调用静态函数模板
【发布时间】:2012-04-09 22:01:40
【问题描述】:

假设我在结构模板template<bool B> S 中有一个静态函数模板template<int I> void ft(),我想从另一个函数模板template<bool B> void g() 调用ft,将布尔模板参数从g 传递给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&lt;B&gt;::ft&lt;12&gt;() 行的两个错误:

  1. ')' 标记之前的预期主表达式
  2. “”和“int”类型的无效操作数转为二进制“运算符”

Comeau (http://www.comeaucomputing.com/tryitout/),在严格的 C++03 模式下,也抱怨该行,声明 “期望一个表达式”,在右括号下方带有一个插入符号。然而,这两个编译器都没有抱怨 S&lt;B&gt;::f() 行,而 Comeau 实际上可以在轻松模式下编译整个最小示例。

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

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

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

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

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

【问题讨论】:

标签: c++ generic-programming function-templates class-template


【解决方案1】:

你需要帮助编译器,告诉它 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;
}

【讨论】:

  • 太棒了,成功了!我刚刚注意到 Stroustrup 的 C++ 编程语言书的 C.13.6“模板作为限定符”部分描述了同样的事情。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2011-03-19
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
相关资源
最近更新 更多