小编Bob*_*tti的帖子

是非法获取嵌套在类模板中的`sizeof`结构的非静态成员吗​​?

在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)

gcc clang language-lawyer c++11 clang++

15
推荐指数
1
解决办法
340
查看次数

如何调试仅在iPhone应用程序的发布目标上发生的EXC_BAD_ACCESS?

我正在开发一个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)

iphone gdb nszombie

14
推荐指数
1
解决办法
1万
查看次数

是一个c ++ 11可变参数函数模板重载与依赖类型不明确?

以下代码是递归可变参数函数重载的教科书示例.在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)

c++ gcc clang language-lawyer c++11

9
推荐指数
1
解决办法
707
查看次数

Django ORM:缓存和操作ForeignKey对象

考虑以下用于空间征服游戏的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)

我正在研究的项目有很多这样的数据模型,我根据各种数据对象之间的复杂交互来改变游戏的状态.我想避免对数据库进行大量不必要的调用,因此每回合一次,我会做类似的事情

  1. 从数据库中查询所有车队,行星和其他对象,并将它们缓存为python对象
  2. 处理游戏对象,解决游戏状态
  3. 将它们保存回数据库中

使用ForeignKey对象时,此模型似乎完全崩溃.例如,当一支新舰队离开一颗行星时,我有一条看起来像这样的线:

fleet.home.ships -= fleet.ships
Run Code Online (Sandbox Code Playgroud)

在这条线路运行之后,我还有其他代码可以改变每个行星上的船只数量,包括行星舰队.遗憾的是,上述行中所做的更改并未反映在我之前获得的行星的QuerySet中,因此当我在转弯结束时保存所有行星时,对fleet.home船只的更改将被覆盖.

有没有更好的方法来处理这种情况?或者这就是所有ORM的方式?

django orm django-models django-orm

7
推荐指数
1
解决办法
3087
查看次数

在gcc 4.8中初始化静态constexpr成员数组

使用-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 ++ …

c++ gcc uniform-initialization constexpr c++11

7
推荐指数
1
解决办法
1055
查看次数