#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
вместо этого.