【发布时间】:2013-10-17 09:18:54
【问题描述】:
在 Java 中使用了一些线程之后,我试图找出线程,但我有点困惑。 两个问题:
- 我可以从线程扩展我的类还是必须通过处理程序从类中管理线程?
- 如何保存上述线程处理程序? std::thread 本身似乎没有命名类型。
我们将不胜感激。
我如何解读这条信息?
src/CHandler.h:27:9: error: 'thread' in namespace 'std' does not name a type
std::thread _thread;
^
这是我扩展线程的尝试:
src/CHandler.h:17:30: error: expected class-name before '{' token
class CHandler : std::thread {
^
完整但麻烦的标题:
#ifndef __projectm__CHandler__
#define __projectm__CHandler__
#include <set>
#include <vector>
#include <thread>
#include "CListener.h"
class CHandler {
public:
virtual bool subscribe(std::shared_ptr<CListener> aListener);
virtual bool unsubscribe(std::shared_ptr<CListener> aListener);
virtual bool hasSubscriber(std::shared_ptr<CListener> aListener);
virtual ~CHandler() {}
protected:
std::thread _thread;
std::vector<std::weak_ptr<CListener> > _subscribers;
std::set<const CListener *> _subscribersSet;
virtual void run();
};
#endif /* defined(__projectm__CDefaultHandler__) */
编译器版本:
bash-3.1$ g++ --version
g++.exe (GCC) 4.8.1
makefile(一团糟,我知道 - 还在学习这个该死的东西):
CC=g++
OUTFILE=game
BINDIR=bin
SRCDIR=src
OBJDIR=obj
CFLAGS=
LDFLAGS=-std=c++0x
all: core
# Ядро проекта.
core: $(OBJDIR)/main.o $(OBJDIR)/CGame.o $(OBJDIR)/CHandler.o $(OBJDIR)/CListener.o
$(CC) $(CFLAGS) $(wildcard $(OBJDIR)/*.o) -o $(BINDIR)/$(OUTFILE)
$(OBJDIR)/main.o: $(OBJDIR)
$(CC) $(LDFLAGS) $(SRCDIR)/main.cpp -c -o $(OBJDIR)/main.o
$(OBJDIR)/CGame.o: $(OBJDIR)
$(CC) $(LDFLAGS) $(SRCDIR)/CGame.cpp -c -o $(OBJDIR)/CGame.o
$(OBJDIR)/CHandler.o: $(OBJDIR)
$(CC) $(LDFLAGS) $(SRCDIR)/CHandler.cpp -c -o $(OBJDIR)/CHandler.o
$(OBJDIR)/CListener.o: $(OBJDIR)
$(CC) $(LDFLAGS) $(SRCDIR)/CListener.cpp -c -o $(OBJDIR)/CListener.o
# Создаем директорию для объектов, если ее нет.
$(OBJDIR):
mkdir $(OBJDIR)
main.o: $(SRC)/main.cpp
【问题讨论】:
-
std::thread是一个类。我不明白你的问题。 -
@BjörnPollex,对不起,我的意思是说“没有命名类型”。尝试将线程对象存储在变量中不起作用。
-
它是一种类型。类是一种类型。
-
@juanchopanza,我想,但编译器仍然抛出非类型错误。
-
这不是问题,但是包含两个连续下划线 (
__projectm__CHandler__) 的名称和以下划线后跟大写字母的名称保留给实现。不要使用它们。
标签: c++ multithreading c++11