Есть такой вот класс
#include <iostream>
template <int D, typename T=double> class Vec{
T p[D];
inline void set_x(){}
template <typename T2, typename ... Args>
inline void set_x(const T2& x, const Args&... xxx){ p[D-1-sizeof...(Args)] = x; set_x(xxx...); }
public:
explicit Vec(T val=0) { for(int i=0; i<D; i++) p[i] = val; }
Vec(const Vec<1, T> &v){ for(int i=0; i<D; i++) p[i] = v[0]; }
template <class T2> /* explicit ??? */ Vec(const Vec<D, T2> &v){ for(int i=0; i<D; i++) p[i] = v[i]; }
template <typename ... Args> explicit Vec(const Args&... xxx){
static_assert(sizeof...(Args)==D, "illegal parametrs count!");
set_x(xxx...);
}
template <class T2> inline Vec& operator = (const Vec<D,T2> &v){
for(int i=0; i<D; i++) p[i] = v[i];
return *this;
}
inline T& operator [] (int i){ return p[i]; }
inline T operator [] (int i) const { return p[i]; }
};
template <int D, typename T1, typename T2>
inline Vec<D, decltype(T1()+T2())> operator + (const Vec<D,T1> &a, const Vec<D,T2> &b){
Vec<D, decltype(T1()+T2())> r;
for(int i=0; i<D; i++) r[i] = a[i]+b[i];
return r;
}
template <int D, typename T> std::ostream& operator << (std::ostream &s, const Vec<D, T> &v){
s<<"Vec<"<<D<<",szT="<<sizeof(T)<<">:";
if(D) s<<v[0]; for(int i=1; i<D; i++) s<<" "<<v[i]; return s;
}
template <typename T, typename ... Args>
inline Vec<1+sizeof...(Args), T> vec(T x, Args ... args){
return Vec<1+sizeof...(Args), T>(x, args...);
}
int main(){
Vec<3, int> x(7,2,3);
Vec<3> y(1.);
std::cout<<(x+y)<<std::endl;
std::cout<<(vec(1)+x)<<std::endl; // <<< тут проблема
}
Хочется что бы поддерживались операции вида
Vec<D,T1>+Vec<D,T2>
Vec<1,T1>+Vec<D,T2>
Vec<D,T1>+Vec<1,T2>
Vec(const Vec<1, T> &v){ for(int i=0; i<D; i++) p[i] = v[0]; }
$ g++ -Wall -O3 -std=c++11 test.cpp
test.cpp: In function ‘int main()’:
test.cpp:49:20: error: no match for ‘operator+’ (operand types are ‘Vec<1, int>’ and ‘Vec<3, int>’)
std::cout<<(vec(1)+x)<<std::endl;
^
test.cpp:49:20: note: candidate is:
test.cpp:29:37: note: template<int D, class T1, class T2> Vec<D, decltype ((T1() + T2()))> operator+(const Vec<D, T1>&, const Vec<D, T2>&)
inline Vec<D, decltype(T1()+T2())> operator + (const Vec<D,T1> &a, const Vec<D,T2> &b){
^
test.cpp:29:37: note: template argument deduction/substitution failed:
test.cpp:49:21: note: deduced conflicting values for non-type parameter ‘D’ (‘1’ and ‘3’)
std::cout<<(vec(1)+x)<<std::endl;
^
Сорри за много букв. cast tailgunner