我有一个包含枚举类的类.
class Shader {
public:
enum class Type {
Vertex = GL_VERTEX_SHADER,
Geometry = GL_GEOMETRY_SHADER,
Fragment = GL_FRAGMENT_SHADER
};
//...
Run Code Online (Sandbox Code Playgroud)
然后,当我在另一个类中实现以下代码时......
std::unordered_map<Shader::Type, Shader> shaders;
Run Code Online (Sandbox Code Playgroud)
...我收到编译错误.
...usr/lib/c++/v1/type_traits:770:38:
Implicit instantiation of undefined template 'std::__1::hash<Shader::Type>'
Run Code Online (Sandbox Code Playgroud)
导致错误的原因是什么?
给定是一个具有静态成员的类.
class BaseClass
{
public:
static std::string bstring;
};
Run Code Online (Sandbox Code Playgroud)
字符串显然是在类之外进行默认初始化.
std::string BaseClass::bstring {"."};
Run Code Online (Sandbox Code Playgroud)
如果我在标题中包含上面的行以及类,我会收到symbol multiply defined错误.它必须在单独的cpp文件中定义,即使使用include guards或pragma once.
有没有办法在标题中定义它?
我正在调整为Lua <5.2编写的库,并接到一个我不知道相当于的电话:
luaL_openlib(L, "Polycore", polycoreLib, 0);
Run Code Online (Sandbox Code Playgroud)
哪里polycoreLib是
static const struct luaL_Reg polycoreLib []
Run Code Online (Sandbox Code Playgroud)
如何将呼叫替换为luaL_openlib?
lua wiki只说:
luaL_openlib(L, name, lreg, x);应该仔细重写这样的调用,因为将搜索并可能创建具有给定名称的全局表.
我打算用一个接受自己类型参数的方法创建一个接口(而不是c ++中的虚拟基类).
class Base {
public:
virtual void seriousMethod(const Base &arg) = 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,派生类不应该是基类类型的参数,而是派生类类型的参数.
class Derived: public Base {
public:
virtual void seriousMethod(const Derived &arg) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
我怎么会意识到这一点?我是否必须模拟基类(例如Base<Derived>)或是否有更清洁的解决方案?
就像前文提到这里,___sincos_stret编译使用使用Xcode5命令行工具,这个符号项目时无法找到.
在上面提到的线程中,为IOS目标发布了一个解决方案(传递-miphoneos-version-min=5.0给编译器),是否有针对desktop(x64)目标的解决方案?
例如,当我尝试编译polycode时,它就会发生.
编辑2:
奇怪的是,在手动编译上一个错误中引用的库之后,错误现在恰好位于lto.o中,这是一个内部llvm头本身...
undef: ___sincos_stret
Undefined symbols for architecture x86_64:
"___sincos_stret", referenced from:
_mdct_init in lto.o
_dradfg in lto.o
Run Code Online (Sandbox Code Playgroud)
我正在使用Xcode 5运行OSX 10.9 DP.这是链接步骤.
运行桌面项目时,新的libGDX项目无法加载库liblwjgl.dylib.
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library:
/var/folders/4l/nsj9j4xj51g8h_6y_ndpnmc80000gn/T/libgdxChristian/3741154320/liblwjgl.dylib
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1798)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1080)
at org.lwjgl.Sys$1.run(Sys.java:70)
at java.security.AccessController.doPrivileged(Native Method)
at org.lwjgl.Sys.doLoadLibrary(Sys.java:66)
at org.lwjgl.Sys.loadLibrary(Sys.java:95)
at org.lwjgl.Sys.<clinit>(Sys.java:112)
at org.lwjgl.openal.AL.<clinit>(AL.java:59)
at com.badlogic.gdx.backends.openal.OpenALAudio.<init>(OpenALAudio.java:70)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.<init>(LwjglApplication.java:80)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.<init>(LwjglApplication.java:64)
at com.foxhat.test.Main.main(Main.java:14)
Run Code Online (Sandbox Code Playgroud)
更新:
我Java 1.8在OSX 10.9上运行.同样的错误不仅出现在自己的项目中,还出现在使用libGDX构建的外部JAR中.
错误中提到的文件夹,在哪里liblwjgl.dylib搜索,包含:
liblwjgl.jnilib
openal.dylib
Run Code Online (Sandbox Code Playgroud)
重命名liblwjgl.jnilib到.dylib 不工作的外国申请,而不是我自己.
当试图编译llvm/clang时
../llvm/configure --enable-cxx11=yes --enable-libcpp=yes
--enable-optimized=yes --prefix=/usr/local --enable-targets=all
--with-gcc-toolchain=/usr/local/bin --enable-bindings=auto
Run Code Online (Sandbox Code Playgroud)
发生以下错误:
[...]llvm/include/llvm/Support/AlignOf.h:19:10: fatal error: 'cstddef' file not found
#include <cstddef>
^
1 error generated.
rm: [...]/llvm_build/lib/Support/Release+Asserts/APFloat.d.tmp: No such file or directory
make[1]: *** [[...]/llvm_build/lib/Support/Release+Asserts/APFloat.o] Error 1
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)
但cstddef确实存在(in /usr/local/include/c++/4.8.0/).添加--includedir=/usr/local/include/c++/4.8.0/到配置也没有帮助.
这可能是什么原因?
我想实现一个回调处理程序.方法应该像以下一样简单注册......
std::multimap<Event::Type, std::function<void()>> actions;
void EventManager::registerAction(Event::Type event, std::function<void()> action) {
actions.insert(std::make_pair(event, action));
}
Run Code Online (Sandbox Code Playgroud)
......确实按预期工作.
但这种方法的问题是,取消注册回调是不可能的......
void EventManager::deregisterAction(Event::Type event, std::function<void()> action) {
for(auto i = actions.lower_bound(event); i != actions.upper_bound(event); ++i) {
// if action == i->second
}
}
Run Code Online (Sandbox Code Playgroud)
...因为无法比较绑定函数.
延迟取消注册也不起作用,因为无法验证函数对象.
void EventManager::handle(Event::Type event) {
for(auto i = actions.lower_bound(event); i != actions.upper_bound(event); ++i) {
if(i->second) // returns true even if the object doesn't exist anymore
i->second();
}
}
Run Code Online (Sandbox Code Playgroud)
那么我应该如何处理这样的实现,如何避免遇到的问题呢?
如何将可拆卸区域添加到QML ApplicationWindow?
以下面的应用程序(Tiled)为例.它有多个可拆卸区域.在第一张图像中,所有区域都附着,而在第二张图像中,区域正在分离/重新连接:

从C++开始,这可以用QDockWidget实现(参见这个问题).但是QML有解决方案吗?