Перекрестное произведение векторов в C ++

Как часть программы, которую я пишу, мне нужно найти перекрестное произведение вектора двойников и вектора сложных двойников. Я написал функцию, которая, как мне кажется, должна это делать, но когда я вызываю ее, я получаю следующую ошибку:

error: no matching function for call to ‘CrossProduct1D(std::vector< double, std::allocator<double> >&, std::vector<std::complex<double>, std::allocator<std::complex<double> > >&)’

Вот мой код:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <math.h>
#include <complex>
using namespace std;

//1D cross product
template <typename T>
vector<T> CrossProduct1D(vector<T> const &a, vector<T> const &b)
{
  vector<T> r (a.size());  
  r[0] = a[1]*b[2]-a[2]*b[1];
  r[1] = a[2]*b[0]-a[0]*b[2];
  r[2] = a[0]*b[1]-a[1]*b[0];
  return r;
}

//::::::::importing data from text::::::::::
  vector<string> ezivec;
  ezivec.reserve(4000);

  string ezidat("ez.i.txt");

  ifstream ezifile;
  ezifile.open(ezidat.c_str());

  if(!ezifile.is_open())
    {
      cerr<<"Error opening file : "<<ezidat.c_str()<<endl;
      return -1;
    }

  string ezistr; //store lines in vector
  while(getline(ezifile, ezistr, ';'))
    {
      ezivec.push_back(ezistr);
    }

  ezifile.close();

 //Converting from vector of strings to vector of floats
  vector<double> ezi (ezivec.size());
  for(int i = 0; i < ezivec.size(); ++i)
    {
      ezi[i] = string_to_T<double>(ezivec[i]);
    }

 //

  vector<string> ezrvec;
  ezrvec.reserve(4000); 

  string ezrdat("ez.r.txt");

  ifstream ezrfile;
  ezrfile.open(ezrdat.c_str());

  if(!ezrfile.is_open())
    {
      cerr<<"Error opening file : "<<ezrdat.c_str()<<endl;
      return -1;
    }

  string ezrstr;
  while(getline(ezrfile, ezrstr, ';'))
    {
      ezrvec.push_back(ezrstr);
    }

  ezrfile.close();

  vector<double> ezr (ezrvec.size());
  for(int i = 0; i < ezrvec.size(); ++i)
    {
      ezr[i] = string_to_T<double>(ezrvec[i]);
    }

//:::::::defining vectors:::::::
vector<vector<complex<double> > > E0 (ezi.size(), vector<complex<double> > (3));
for(int i = 0; i < ezi.size(); i++)
{
  E0[i][0].real() = 0.0;
  E0[i][0].imag() = 0.0;
  E0[i][1].real() = 0.0;
  E0[i][1].imag() = 0.0;;
  E0[i][2].real() = ezr[i];
  E0[i][2].imag() = ezi[i];
} 

vector<double> n_a (3);
n_a[0] = 1.0;
n_a[1] = 0.0;
n_a[2] = 0.0;

//:::::::calling cross product:::::::
for(int j = 1; j < jmax; j++)
    {
      M[j] = CrossProduct1D(n_a, E0[j]);
    }

«ez.i.txt» и «ez.r.txt» - это текстовые файлы, разделенные точками с запятой и содержащие 4000 номеров.


person user1507246    schedule 19.07.2012    source источник
comment
Когда вы спрашиваете об ошибке компилятора, вы должны напрямую процитировать все сообщение компилятора. Ваш код не полон и не прост, поэтому кому-то придется приложить нетривиальные усилия, чтобы воспроизвести вашу проблему. У вас меньше шансов получить полезный ответ.   -  person Adam    schedule 19.07.2012
comment
Насколько мне известно, оператор перекрестного произведения определен только для R ^ 4   -  person Dan F    schedule 19.07.2012
comment
@Adam Извините, я отредактировал свой пост.   -  person user1507246    schedule 19.07.2012
comment
Код все еще не завершен. Попробуйте скомпилировать его, и вы получите множество ошибок, жалуясь на отсутствие определений для string_to_T, M, jmax и т. Д., Не говоря уже о том, что у вас есть целая куча кода, сидящего на уровне пространства имен, а не внутри функции. .   -  person abarnert    schedule 19.07.2012


Ответы (1)


Ваша функция шаблона параметризована для одного типа, T, и принимает два vector<T>, но вы пытаетесь передать ей два разных типа векторов, поэтому нет единого T, который можно было бы выбрать.

У вас может быть два параметра шаблона, например

template<class T, class U> CrossProduct1D(std::vector<T> const& a,
                                          std::vector<U> const& b)
person CB Bailey    schedule 19.07.2012