Проблемы с передачей анонимной временной функции-объекта шаблонному конструктору
Я пытаюсь прикрепить функцию-объект, который будет вызван при уничтожении шаблонизированного класса. Однако я не могу, кажется, быть в состоянии передать функцию-объект как временный. Предупреждение, которое я получаю (если комментарий строка xi.data = 5;
):
warning C4930: 'X<T> xi2(writer (__cdecl *)(void))':
prototyped function not called (was a variable definition intended?)
with
[
T=int
]
И если я попытаюсь использовать сконструированный объект, я получу ошибку компиляции, говорящую:
error C2228: left of '.data' must have class/struct/union
Я прошу прощения за длинный кусок кода, но я думаю, что все компоненты должны быть видны, чтобы оценить ситуацию.
template<typename T>
struct Base
{
virtual void run( T& ){}
virtual ~Base(){}
};
template<typename T, typename D>
struct Derived : public Base<T>
{
virtual void run( T& t )
{
D d;
d(t);
}
};
template<typename T>
struct X
{
template<typename R>
X(const R& r)
{
std::cout << "X(R)" << std::endl;
ptr = new Derived<T,R>();
}
X():ptr(0)
{
std::cout << "X()" << std::endl;
}
~X()
{
if(ptr)
{
ptr->run(data);
delete ptr;
}
else
{
std::cout << "no ptr" << std::endl;
}
}
Base<T>* ptr;
T data;
};
struct writer
{
template<typename T>
void operator()( const T& i )
{
std::cout << "T : " << i << std::endl;
}
};
int main()
{
{
writer w;
X<int> xi2(w);
//X<int> xi2(writer()); //This does not work!
xi2.data = 15;
}
return 0;
};
В причина, по которой я пытаюсь это сделать, заключается в том, что я могу "каким-то образом" присоединить типы function-Object к объектам, не сохраняя экземпляр самого function-object в классе. Таким образом, когда я создаю объект class X
, мне не нужно держать в нем объект class writer
, а только указатель на Base<T>
(я не уверен, нужен ли мне <T>
здесь, но пока его нет).
Проблема в том, что я, кажется, должен создать объект writer
и затем передать его конструктору X
, а не назовем это как X<int> xi(writer();
Возможно, я упускаю что-то совершенно глупое и очевидное здесь, какие-нибудь предложения?
3 ответа:
Похоже на" самый неприятный разбор". Попробуйте
X<int> xi2 = X<int>(writer());
Или
X<int> xi2((writer()));
Решение состоит в том, чтобы либо сделать то, что вы сделали, избегая временного, либо добавить больше скобок.
X<int> xi2(writer());
является объявлением функции под названием xi2, которая сама возвращаетX<int>
и принимает в качестве параметра функцию, которая не принимает параметров и возвращает запись. Это "самый неприятный разбор".