c ++, печать данных любого типа (шаблон T) на консоль - PullRequest
0 голосов
/ 15 января 2019

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

Mutex_Loggers.h

namespace Loggers
{
    std::mutex m_mutex;
    template<typename T>
    void sharedLog(const std::string& message, T data)
    {
        std::lock_guard<std::mutex> locker(m_mutex);
        std::cout << message << data << std::endl;
    }
}

и один из файлов, который его называет, например, main.cpp

#include "Mutex_Loggers.h"
/*other stuff*/
Loggers::sharedLog("IN THREAD: ", std::this_thread::get_id());
Loggers::sharedLog("IN APP CREATION ", nullptr);
Loggers::sharedLog("IN create_CtrApp_and_register ", {1,2,3});

во время компиляции я получаю следующие ошибки:

Оператор C2593 << является неоднозначным

C2679 бинарный << не найден оператор, который принимает правый операнд типа T (или нет приемлемого преобразования)

Как я могу иметь функцию, которая печатает данные любого типа

1 Ответ

0 голосов
/ 15 января 2019

Проблема в том, что вы вызываете operator<< для типов, которые не перегружают тот оператор, который вы затем вызываете внутри вашей sharedLog функции.

Для записи экземпляра типа T в std::ostream таким образом, вам необходимо перегрузить operator<<.

Оператор должен быть реализован вне типа T и иметь следующую подпись:

std::ostream& operator<< (std::ostream &out, const T& arg);

Если ему нужен доступ к закрытым и защищенным членам T, он также должен быть объявлен как друг:

friend std::ostream& operator<< (std::ostream &out, const T& arg);

Он должен возвращать ссылку out, которую он получает в качестве первых аргументов, чтобы можно было объединять вызовы:

str << a << b << c;

Более подробную информацию вы можете найти здесь: https://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/

C2593 оператор << неоднозначен </p>

У вас есть 2 или более реализаций, которые оба являются кандидатами, и компилятор не знает, какую из них выбрать. Сообщение об ошибке содержит дополнительные сведения, которые указывают на кандидатов, чтобы вы могли увидеть, какие типы конфликтов. См. Здесь: ошибка C2593: «оператор <<» является неоднозначным </a>

C2679 двоичный << оператор не найден, который принимает правый операнд типа T (или нет приемлемого преобразования) </p>

Вы звоните operator<< для типа, который не перегружает его, как описано в начале моего ответа.

...