Как преобразовать тип char * в тип данных c, используя только одну функцию или / и преобразование оператора перегрузки? - PullRequest
0 голосов
/ 31 марта 2020

У меня есть шаблон класса Polinom, который использует обобщенные типы данных c (int, float, double, класс Complex (определено мной)), и я хочу преобразовать строку в Polinom, используя эту функцию для чтения и Конструктор:

Полион. cpp

 template<typename T>
 istream& operator>>(istream& in, Polinom<T>& P) {
     char line[1000];
     in.getline(line, 1000);
     int gr = -1;
     T cf[100];
     char* pt;
     pt = strtok(linie, " ");
     while (pt) {
        cf[++gr] = T(pt);
        pt = strtok(NULL, " ");
     }
     P = Polinom<T>(gr, cf);
     return in;
 }

Комплекс. cpp

  Complex::Complex(const char* str){
    /*
    ...
    */
    }

Все хорошо, когда я использую комплексный тип данных (Полином а (12 , 4); std :: cout << a << endl;) // Я определил функцию друга ostream для этой строки; ) потому что я пишу этот конструктор Complex :: Complex (const char * str) </p>

Проблемы возникают, когда я использую примитивные типы данных

   Polinom<int> a(12, 4); because of T(const char* ) ===> int(const char*)

Как я могу решить эту проблему? Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Я обновил свой код следующим образом:

Полином. cpp

 template<typename T>
 istream& operator>>(istream& in, Polinom<T>& P) {
     char linie[1000];
     in.getline(linie, 1000);
     int gr = -1;
     T cf[100];
     char* pt;
     pt = strtok(linie, " ");
     while (pt) {
       T a;
       string aux;
       try {
          aux = string(pt);
          if(aux.find("i") != string::npos) throw std::invalid_argument("invalid");
          a = std::stod(pt);
       }
       catch(const std::invalid_argument& e){
           cf[++gr] = (T)(pt);
           goto execute;
       }
      cf[++gr] = a;
      execute:
      pt = strtok(NULL, " ");
      }
      P = Polinom<T>(gr, cf);
      return in;
  }
 int main()
 {
    Polinom<Complex> a(12, 4);   // it works
    std::cout << a << endl; 
    Polinom<int> b;             // it works
    std::cin >> b;
    std::cout << b;
    Polinom<double> c;         // error C2440   'type cast': cannot convert from char* 
                               // to 'T'
    std::cin >> c;
    std::cout << c;
    return 0;

}

0 голосов
/ 31 марта 2020

Похоже, вы заново изобретаете колесо. Уже есть правильное значение operator>> для int. Вы должны добавить перегрузку для вашего Complex, чтобы in >> cf[gr++] компилировался для каждого T.

...