c++ - Expression template operator overloading problem with std::vector -


i'm working on numerical library uses expression templates. unfortunately encountered problem operator overloads. consider following stripped down example.

#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() { } 

which gives following error message when compiling gcc 4.4.3 or clang 2.8:

in file included eir_test.cc:2: in file included /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. 

for reason compilers lookup test namespace , find general operator. used form traits magic reduce number of version had make operator. should accept 4 different datatypes (including double , int) lead lot of different combinations.

is there way make work without spelling out combinations every operator?

this because end() returns type class template specialization has 1 argument of type test::test *. when operator- applied in expression end() - 1, argument dependent lookup looks also in namespace of test::test. finds operator- , passes iterator , int.

you fix not accepting , types arguments. example, try accepting (testexpr<a1, b1>, testexpr<a2, b2>) instead. show combinations, possibly there way cut them down using way formulate them?

in opinion, implementation acts way should non-conforming (i think disgusting though). because doing iterator - 1 specified yield iterator previous element , must not crazy that, think. 1 way declare operator non-template accepting iterator type , integer argument (which of iterator's difference_type) directly. way version should preferred.


Comments

Popular posts from this blog

ASP.NET/SQL find the element ID and update database -

c++ - Compiling static TagLib 1.6.3 libraries for Windows -

PostgreSQL 9.x - pg_read_binary_file & inserting files into bytea -