私は現在、式テンプレートを使用する数値ライブラリに取り組んでいます。残念ながら、オペレーターのオーバーロードで問題が発生しました。次の簡略化された例を考えてみましょう。
#include <vector>
namespace test {
class test {};
template<class A, class B>
class testExpr {};
template<class A, class B>
testExpr<A, B>
operator-(A a, B b)
{
return testExpr<A, B>();
}
}
test::test
stuff(std::vector<test::test> &v)
{ return v.back(); }
int main()
{ }
これにより、gcc4.4.3またはclang2.8でコンパイルすると次のエラーメッセージが表示されます。
In file included from eir_test.cc:2:
In file included from /usr/include/c++/4.4/vector:64:
/usr/include/c++/4.4/bits/stl_vector.h:696:16: error: indirection requires pointer operand
('testExpr<__gnu_cxx::__normal_iterator<test::test *, std::vector<test::test, std::allocator<test::test> > >, int>' invalid)
{ return *(end() - 1); }
^~~~~~~~~~~~
eir_test.cc:21:12: note: in instantiation of member function 'std::vector<test::test, std::allocator<test::test> >::back' requested here
return v.back();
^
1 error generated.
何らかの理由で、コンパイラはテスト名前空間を検索し、私の一般的な演算子を見つけます。このフォームをいくつかの特性の魔法と一緒に使用して、オペレーターのために作成する必要のあるバージョンの数を減らしました。4つの異なるデータ型(doubleとintを含む)を受け入れる必要があります。これにより、多くの異なる組み合わせが発生します。
すべてのオペレーターのすべての組み合わせを綴らずにこれを機能させる方法はありますか?