私が持っている一部のコードがコンパイルされない理由を理解しようとしており、匿名化をかなり削減して、この例になります。
#define NULL ((void*)0)
template<typename T>
class a {
public:
template<bool b>
T * amem() {
return NULL;
}
};
template<typename T>
class b {
public:
a<T>* ap;
template <bool b>
T * m() {
return ap->amem<b>();
}
};
int main()
{
return 0;
}
使用するコンパイラと変数の名前に応じて、さまざまなエラーが発生します。ただし、それらはすべてこの行を中心にしています。
return ap->amem<b>();
clang++ [Apple clang バージョン 4.0 (tags/Apple/clang-421.0.57) (LLVM 3.1svn ベース)] を使用してコンパイルすると、次のメッセージが表示されます。
tmp.cpp:18:26: error: expected expression
return ap->amem<b>();
^
1 error generated.
g++ [i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1] を使用してコンパイルすると、次のメッセージが表示されます。
tmp.cpp: In member function ‘T* b<T>::m()’:
tmp.cpp:18: error: expected primary-expression before ‘>’ token
tmp.cpp:18: error: expected primary-expression before ‘)’ token
不思議なことに(とにかく、私には)。amem の名前を m に変更すると、g++ からはエラーが発生しなくなりますが、clang++ からは同じエラーが発生します。
ここに私が理解できない何かがあると確信していますか?clang と gcc が探している式を知っている人はいますか? この問題を解決する方法を知っている人はいますか?
これがコンパイラのバグである場合 (疑わしいと思われます)、amem を (テンプレートではなく) bool パラメーターを持つ関数に変換することを伴わない回避策を知っている人はいますか? 私はすでにこれを行っており、これが問題を回避することを確認できますが、これはホット ループ内にあり、b によってオンに切り替えられたコードは、おそらくホット ループにあってはならないメモリ割り当てです。