Привет всем Я хочу сделать что-то вроде этого:Наследовать от проблем класса шаблон
template<typename T>
struct APP_Interface{
APP_Interface* shared;
Mutex m;
T data;
virtual void publish(){
//copy data from this->data to shared->data
}
virtual void receive(){
//copy data from shared->data to this->data
}
};
struct MyInterface : APP_Interface<MyInterface>{
float MyData1;
float MyData2;
};
Я бегу (не так удивительно, я думаю) в:
error: 'APP_Interface<T>::data' has incomplete type
error: forward declaration of 'struct MyInterface '
Есть ли способ обойти это?
EDIT: То, что я пытаюсь добиться
У меня есть две темы. Thread1 производит данные в реальном времени, и Thread2 потребляет эти данные. Теперь я хочу, чтобы Thread1 делил данные с Thread2 через общие данные и мьютексы.
На самом деле существует много потоков и множество разных интерфейсов данных, разделяющих разные данные. Поэтому я хочу простой и элегантный способ создания и использования интерфейсов.
Я хочу, чтобы создать интерфейс что-то вроде этого:
struct MyInterface : ??? {
float MyData1;
float MyData2;
};
Тогда, когда я должен использовать его, я просто хочу, чтобы:
//Thread1.hpp
class thread1{
void run(){
interface.MyData1 = 100;
interface.publish();
}
public:
MyInterface interface;
}
//And something similar for thread2 at the receiving end
Наконец я хочу достичь некоторых телицы инъекции зависимостей» «разрешив main.c создать связь между ними и выделить общую структуру. Например, за счет:
//main.cpp
void main(){
//Bind interfaces:
MyInterface interface({ &thread1.interface, //PROVIDER
&thread2.interface, //CONSUMER
});
}
Я понятия не имею, если это объяснение имеет смысл :)
Это не имеет смысла. Чего вы пытаетесь достичь? Как правило, вы либо хотите, чтобы ваш производный класс был templated, или вы хотите специализировать APP_Interface. Я предполагаю, что вы хотите это: 'struct MyData { float MyData1; float MyData2; }; APP_Interface myDataPublisher; ' –
ventsyv
Хорошо, что это не удастся. У вас будет MyInterface, который был App_Interface, который содержал MyInterface, который был App_Interface, который содержал ... Я не думаю, что мы можем ответить, как исправить эту проблему, если вы не сообщите нам, как вы планируете использовать это. Лично я бы опубликовал и получал реферат и делал с ним. – IdeaHat
'T data;' должны быть 'T * данными;' В любом случае посмотрите [** здесь **] (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Curiously_Recurring_Template_Pattern), пожалуйста, как создать и используйте 'CRTP' правильно. –