3

template<int I> void ft()struct template 内に静的関数テンプレートがあり、別の関数 template から呼び出して、bool テンプレート パラメーターを from に渡しtemplate<bool B> Sたいとします。fttemplate<bool B> void g()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;
}

これを GCC 4.5.2 でコンパイルすると、行に関する 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 は、厳密な C++03 モードでの Comeau と同様に、正常にコンパイルします。

上記の GCC の 2 番目のエラーから、が 12 未満S<B>::ft<12>かどうかをテストしようとしているかのように、 の解釈にあいまいさがあるようです。依存スコープ内の型。依存スコープに現れるものが型ではなく関数である場合、あいまいさを解決する方法を知っている人はいますか?S<B>::fttypename

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 に答える