John Maddock
I 'm trying to put the implementation into a dll and mark the explicit instantiation of Normal as exported with the following results: 1) With the small_dim_ctor's enabled I get the static assertion when marked for export 2) With the small_dim_ctor's enabled everything is ok when not marked for export 3) With the small_dim_ctor's disabled everything is ok regardless of export marking 4) If I comment out the BOOST_STATIC_ASSERT and build my app with export enabled I can use the resulting dll without any problems
I'm thinking that marking for export is somewhow generating an implicit conversion somewhere but I don't know how.
Unfortunately, when you explicitly instantiate a template every non-template member function gets instantiated, and that triggers the static asserts.
The only workarounds I can see are:
1) Use regular asserts whenever the class is being exported rather than static asserts. 2) Use partial template specialisations for the N = 1, 2 or 3 cases and give them different constructors (no need to static asserts then). 3) Use template constructors instead:
template <class U> explicit Vector( U x ) { BOOST_STATIC_ASSERT(DIM==1); data_[0]=x; }
Hope this helps, John.
Soln 1) I was trying for compile time checks but will fall back to this
Soln 2) I understood partial specialization wasn't supported in VStudio but I
might do this for float, double and dim 1-4; I had started to do something
similar by deriving Vector3<T> template from Vector