Неверный аргумент шаблона в векторе / c ++

Я пытаюсь заполнить вектор, который принимает несколько типов аргументов, которые я определил. Тем не менее, я получаю недопустимую ошибку аргумента шаблона, несмотря на добавление векторной библиотеки и использование пространства имен std. Это потому, что я пытаюсь поставить имена классов, которые я определил? Должен ли я использовать другой метод для объединения моих разных массивов? Вот мои соответствующие заголовочные и cpp файлы. Коды читают файл списка соединений (текстовый файл) и должны возвращать вектор, который содержит информацию о компоненте. Пожалуйста помоги.

hpp файл:

#ifndef NETLISTREADER_HPP_
#define NETLISTREADER_HPP_
#include <vector>
#include <iostream>
#include "Resistor.hpp"
#include "Capacitor.hpp"
#include "Voltage.hpp"
#include "Opamp.hpp"

using namespace std;

vector <Resistor, Capacitor, Opamp> NetlistReader;


#endif /* NETLISTREADER_HPP_ */

файл cpp:

#include <iostream>
#include <string>
#include <fstream>
#include <istream>
#include <cstring>
#include <vector>
#include "Resistor.hpp"
#include "Capacitor.hpp"
#include "Voltage.hpp"
#include "Opamp.hpp"

using namespace std;

vector <Resistor, Capacitor, Opamp> NetlistReader() {

    ifstream netlist("C:\Users\lenovo\Desktop\BassmanNetlist.txt");
    if (!netlist.is_open())
    {
        std::cerr << "Failed to open netlist.txt." << std::endl;
    }

    int n=0;
    int maxnode=0;
    string str;
    string componentName;
    int node1;
    int node2;
    double value;

    int Rcounter=0;
    int Ccounter=0;
    int Ocounter=0;

    while(getline(netlist,str)){
    netlist >> componentName >> node1 >> node2 >> value;
    maxnode= max(node1,node2);
    n=max(n,maxnode);

    switch(componentName[0]){
    case 'R':
    Rcounter++;
    break;
    case 'C':
    Ccounter++;
    break;
    case 'O':
    Ocounter++;
    break;
    }
    }
    cout<< "n is "<<n<<endl;

    Capacitor C[Ccounter]={};
    Resistor R[Rcounter]={};
    Opamp O[Ocounter]={};

    int counter_R=0;
    int counter_C=0;
    int counter_O=0;

         while(getline(netlist,str)){
            netlist >> componentName >> node1 >> node2 >> value;

            switch(componentName[0]){
            case 'R':
            R[counter_R]=Resistor(node1,node2,value);
            counter_R++;
            break;
            case 'C':
            C[counter_C]=Capacitor(node1,node2,value);
            counter_C++;
            break;
            case 'O':
            O[counter_O]=Opamp(node1,node2,value);
break;
            }
            }
         vector<Resistor,Capacitor, Opamp> NetlistReader;
         NetlistReader.push_back(R);
         NetlistReader.push_back(C);
         NetlistReader.push_back(O);
         return NetlistReader;
}

Спасибо!

Всего 2 ответа


Вопрос в том, почему вы хотите хранить их вместе. Они как-то похожи друг на друга? У них есть какой-то общий фактор? Вы не предоставили нам реализацию вашего резистора, конденсатора и операционного усилителя. Если это классы с общим интерфейсом, вы можете создать sth-подобный Component, а затем наследовать его.

#include <iostream>
#include <vector>
#include <memory>

struct IComponent
{
    virtual ~IComponent() = default;
    virtual void someCommonMethod() const = 0;
};

struct Resistor : IComponent
{
    void someCommonMethod() const final
    {
        // impl
    }
};

struct Capacitor : IComponent
{
    void someCommonMethod() const final
    {
        // impl
    }
};

int main()
{
    std::vector<std::unique_ptr<IComponent>> components;;
    components.push_back(std::make_unique<Resistor>());
    components.push_back(std::make_unique<Capacitor>());

    return 0;
}

Вектор может содержать только один тип, но сам этот тип может содержать другие типы. Вы можете иметь вектор пары или вектор кортежа. Поскольку у вас есть более двух типов, используйте кортеж:

vector <tuple<Resistor, Capacitor, Opamp>> NetlistReader;

Далее, то, что вы пытаетесь сделать здесь, совершенно неправильно:

         vector<Resistor,Capacitor, Opamp> NetlistReader;
         NetlistReader.push_back(R);
         NetlistReader.push_back(C);
         NetlistReader.push_back(O);

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

NetlistReader.push_back(make_tuple(R,C,O));

Есть идеи?

10000