печать содержимого шаблона функции с указателем класса - PullRequest
0 голосов
/ 19 февраля 2019

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

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
using namespace std;
template <typename T>

    class Test1{
        public:
            int val1 = 10;
            string val2 = "hello"; 
    };

    class Test2{
        public:
            int val1 = 20;
            string val2 = "hai";
    };
    class Queue{
    public:
        void append(T & item)
        {
            {
                std::lock_guard<std::mutex> lock(mutex);
                cout<<"string to be added "<<item->val2;
                mQueue.push_back(item);
            }
        }
    private:
        std::vector<T> mQueue;
    };
    int main(int argc, char** argv) {
        Test2 *new_val;
        Queue *data;
        data->append(new_val);
        return 0;
    }

Кто-нибудь может указать на ошибку и что можно сделать, чтобы напечатать строки различных классов внутри шаблона функции.

1 Ответ

0 голосов
/ 19 февраля 2019

Внимание: когда вы пишете

template <typename T>

    class Test1{
        public:
            int val1 = 10;
            string val2 = "hello"; 
    };

    class Test2{
        public:
            int val1 = 20;
            string val2 = "hai";
    };
    // ...

, вы определяете Test1 как класс шаблона, Test2 и следующие классы как обычные (не шаблонные) классы.

Итак,когда вы пишете

class Queue{
public:
    void append(T & item)
    {
        {
            std::lock_guard<std::mutex> lock(mutex);
            cout<<"string to be added "<<item->val2;
            mQueue.push_back(item);
        }
    }
private:
    std::vector<T> mQueue;
};

, компилятор не знает, что такое T, потому что T является параметром шаблона Test1.

Полагаю, вам нужен шаблон Queue

template <typename T>
class Queue{
   // ...
};

// ...

Test2 new_val;

Queue<Test2> data;

data.append(new_val);

Заметьте, что я также трансформировал указатели в объекте.Предложение: избегайте указателей, пока они вам не станут понятны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...