template<int I> void ft()
struct template 内に静的関数テンプレートがあり、別の関数 template から呼び出して、bool テンプレート パラメーターを from に渡しtemplate<bool B> S
たいとします。ft
template<bool B> void g()
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 でコンパイルすると、行に関する 2 つのエラーが発生しますS<B>::ft<12>()
。
- ')' トークンの前にプライマリ式が必要です
- 型 '<未解決のオーバーロードされた関数型>' および '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>::ft
typename