Определение класса с функциями-членами шаблона в файле .ipp

#c #templates

Вопрос:

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

Это главное:

 // Includes
#include <iostream>
#include "Monitor.hpp"

// Main
int main()
{
    Monitor monitor;

    std::cout << "Press any key to exit ..." << std::endl;
    std::cin.get();

    return 0;
}
 

Файл .hpp:

 #pragma once

#include <thread>
#include <mutex>
#include <condition_variable>

class Monitor
{
private:

    // Mutex to lock data access
    std::mutex m_mutex;

    // Condition variable to wait for data availability
    std::condition_variable m_conditionVariable;

    // Flag to indicate if data is ready
    bool m_isReady;

public:

    // Constructor
    Monitor();

    // Destructor
    ~Monitor();

    // Function that captures the data
    template <class T>
    bool captureData(Tamp; f_captureObject, bool (T::* f_captureFunction)());
};

#include "Monitor.ipp"
 

И файл .ipp:

 Monitor::Monitor()
{
    // Init flag to data not ready
    m_isReady = false;
}

Monitor::~Monitor()
{
}

template <class T>
bool Monitor::captureData(Tamp; f_captureObject, bool (T::* f_captureFunction)())
{
    // Lock data access
    std::unique_lock<std::mutex> lock(m_mutex);

    // Capture data and check if it is ready
    if ((f_captureObject.*f_captureFunction)() == true)
    {
        // If data is ready ...

        // Set data flag to ready
        m_isReady = true;

        // Notify if processing thread is waiting
        m_conditionVariable.notify_one();
    }
    else
    {
        // If data is not ready ...

        // Set data flag to not ready
        m_isReady = false;
    }

    // Return grab state
    return !m_isReady;
};
 

И я обнаружил эти ошибки:

Имя E0276, за которым следует»::», должно быть именем класса или пространства имен

Ошибка C2653 «Монитор»: не является именем класса или пространства имен

Почему файл .ipp не распознает имя «Монитор»? Заранее спасибо

Комментарии:

1. Похоже, вы пропустили inline ключевое слово в этих процедурах.

2. inline это проблема, но не основная причина. Это ошибки компиляции, а не ссылки. Плюс шаблон неявно inline .

3. У вас есть циклическое включение — эти два файла включают друг друга. Падение #include "Monitor.hpp" с Monitor.ipp

4. Я согласен с @IgorTandetnik, но если я это сделаю, компилятор не распознает монитор классов в файле .ipp.

5. Вы включаете Monitor.ipp непосредственно где-то, кроме как в нижней части Monitor.hpp ? Не надо, включайте Monitor.hpp вместо этого.