在clang/llvm 3.6.2中,以下代码在编译时导致编译错误std=c++11:
template <typename T=void>
class bar
{
public:
struct foo
{
int array[10];
};
int baz()
{
return sizeof(foo::array);
}
};
int main(void)
{
bar<> b;
return b.baz();
}
Run Code Online (Sandbox Code Playgroud)
命令行调用:
$ clang++ -std=c++11 nonstatic.cpp -o nonstatic
nonstatic.cpp:12:28: error: invalid use of non-static data member 'array'
return sizeof(foo::array);
~~~~~^~~~~
nonstatic.cpp:20:14: note: in instantiation of member function
'bar<void>::baz' requested here
return b.baz();
Run Code Online (Sandbox Code Playgroud)
如果我改为bar不再是模板,就像在
class bar
{
public:
struct foo
{
int array[10];
};
int baz()
{
return …Run Code Online (Sandbox Code Playgroud) 我正在开发一个iPhone应用程序.我有一个EXC_BAD_ACCESS只发生在发布目标; 当我构建调试目标时,不会发生异常.但是,当我将NSZombieEnabled环境变量设置为时YES,我仍然EXC_BAD_ACCESS没有进一步的信息.甚至可以NSZombieEnabled在执行发布目标时工作吗?我不明白为什么不,因为gdb在两种情况下都运行...
更新:这是堆栈顶部的打印输出:
#0 0x33369ebc in objc_msgSend ()
#1 0x3144f968 in -[EAInputStream _streamEventTrigger] ()
#2 0x3144fe78 in __streamEventTrigger ()
#3 0x338ae3a6 in CFRunLoopRunSpecific ()
#4 0x338adc1e in CFRunLoopRunInMode ()
#5 0x32ed6966 in -[NSRunLoop(NSRunLoop) runMode:beforeDate:] ()
#6 0x00005b06 in -[IOStreamDelegate removeMsg:] (self=0x142cc0, _cmd=<value temporarily unavailable, due to optimizations>, message=0x2fffe544) at /Users/robertmoretti/Documents/XXXXXXX/IOStreamDelegate.m:191
Run Code Online (Sandbox Code Playgroud)
这是来自顶部objc_msgSend调用内部的gdb会话:
(gdb) p/x $r0
$6 = 0x3100000
(gdb) x/s $r1
0x32d7cff8: "release"
(gdb) disassemble $pc
Dump of assembler code …Run Code Online (Sandbox Code Playgroud) 以下代码是递归可变参数函数重载的教科书示例.在clang和GCC中,它编译干净,并main返回36(如预期的那样):
template <typename T>
int add(T val)
{
return val;
}
template <typename FirstTypeT, typename... RestT>
int add(FirstTypeT first_value, RestT... rest)
{
return first_value + add<RestT...>(rest...);
}
int main(void)
{
return add(12, 12, 12);
}
Run Code Online (Sandbox Code Playgroud)
但是,这里稍作修改.它直接在模板定义中使用依赖类型而不是模板参数:
struct Foo
{
using SomeType = int;
};
template <typename T>
int add(typename T::SomeType val)
{
return val;
}
template <typename FirstT, typename... RestT>
int add(typename FirstT::SomeType first_value, typename RestT::SomeType... rest)
{
return first_value + add<RestT...>(rest...);
}
int main(void)
{
return add<Foo, …Run Code Online (Sandbox Code Playgroud) 考虑以下用于空间征服游戏的models.py骨架:
class Fleet(models.Model):
game = models.ForeignKey(Game, related_name='planet_set')
owner = models.ForeignKey(User, related_name='planet_set', null=True, blank=True)
home = models.ForeignKey(Planet, related_name='departing_fleet_set')
dest = models.ForeignKey(Planet, related_name='arriving_fleet_set')
ships = models.IntegerField()
class Planet(models.Model):
game = models.ForeignKey(Game, related_name='planet_set')
owner = models.ForeignKey(User, related_name='planet_set', null=True, blank=True)
name = models.CharField(max_length=250)
ships = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
我正在研究的项目有很多这样的数据模型,我根据各种数据对象之间的复杂交互来改变游戏的状态.我想避免对数据库进行大量不必要的调用,因此每回合一次,我会做类似的事情
使用ForeignKey对象时,此模型似乎完全崩溃.例如,当一支新舰队离开一颗行星时,我有一条看起来像这样的线:
fleet.home.ships -= fleet.ships
Run Code Online (Sandbox Code Playgroud)
在这条线路运行之后,我还有其他代码可以改变每个行星上的船只数量,包括行星舰队.遗憾的是,上述行中所做的更改并未反映在我之前获得的行星的QuerySet中,因此当我在转弯结束时保存所有行星时,对fleet.home船只的更改将被覆盖.
有没有更好的方法来处理这种情况?或者这就是所有ORM的方式?
使用-std = c ++ 11时,以下代码在gcc 4.9.1和clang-3.6中编译和运行:
struct Bar
{
int x;
};
struct Foo
{
static constexpr Bar bars[] = {1, 2, 3};
};
constexpr Bar Foo::bars[];
Run Code Online (Sandbox Code Playgroud)
但是,它在gcc 4.8.3中失败,导致错误消息
./cpptest.cpp:14:43: error: could not convert '1' from 'int' to 'const Bar'
static constexpr Bar bars[] = {1, 2, 3};
^
./cpptest.cpp:14:43: error: could not convert '2' from 'int' to 'const Bar'
./cpptest.cpp:14:43: error: could not convert '3' from 'int' to 'const Bar'
Run Code Online (Sandbox Code Playgroud)
顺便说一下,如果我做同样的事情但是创建bars一个静态const全局数组,它在gcc 4.8和clang中编译得很好.如果我用额外的一对包围列表中的每个整数文字,它也会编译得很好{}.
这是gcc 4.8中的一个错误吗?标准所说的是适当的语法?当我省略额外的括号时,调用c ++ …