小编Jor*_*eit的帖子

CUDA:为什么不能定义静态全局成员函数?

当使用nvcc(CUDA 5.0)编译下面的代码时,出现错误"内存限定符的非法组合",因为显然不可能在类中具有全局内核.

class A
{
public:
    __global__ static void kernel();
};

__global__ void A::kernel()
{}
Run Code Online (Sandbox Code Playgroud)

在处理非静态成员时我可以理解这个限制,但是为什么在内核声明为静态时仍然会出现错误?调用此类成员与在函数体中声明函数时调用该函数没有什么不同(A在本例中).

A::kernel <<< 1, 1 >>> ();
Run Code Online (Sandbox Code Playgroud)

有没有理由我错过了为什么还没有实现呢?

编辑:根据答案和评论中的回答,我对我的问题不够清楚.我的问题不是出现错误的原因.显然,这是因为它尚未实施.我的问题是为什么它没有得到实施.到目前为止,我还没有想到让这个功能得以实现的原因.我意识到我可能已经忘记了一个会使问题复杂化的特殊情况,因此也就是问题.

我认为这是一个合理的功能的原因是:

  • 静态函数没有this指针所以即使在主机上的对象上调用内核,访问其数据也没有冲突,因为这些数据首先是不可访问的(来自哪个对象的数据? ).
  • 您可能会争辩说,如果类具有与之关联的静态数据,并且存在于主机上,那么原则上应该可以从静态内核访问它.但是,也不支持静态数据,因此不会发生冲突.
  • 在主机上的对象上调用静态内核(A a; a.staticKernel<<<...,...>>>();)完全等同于在没有对象的情况下调用它(A::staticKernel<<<...,...>>>();),正如我们在常规C++中习惯的那样.

我错过了什么?

c++ static cuda global member

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

MSVC:非成员函数上不允许使用修饰符

我在linux下编写了一个Signal/Slot库(Codeproject文章),用Clang 3.5和GCC4.9编译.它在两个编译器上都没有警告地编译(也在版本3.4和4.8上).当我把它全部工作,并在网上发布文章时,不久我得到的投诉是它不能在MSVC上工作.(Visual Studio Express 2013?对不起,我对版本控制系统并不熟悉.)我将它安装在虚拟机中以便自己查看并发现它不会编译以下内容:

template <typename Signature>
struct RemoveCV;

template <typename R, typename ... Args>
struct RemoveCV<T, R (Args...)>
{
    using Type = R(Args...);
};

template <typename R, typename ... Args>
struct RemoveCV<T, R(Args...) const>
{
    using Type = R(Args...);
};

// more specializations for volatile and const volatile

// Usage:
template <typename Signature_>
struct Function
{
    using Signature = RemoveCV<Signature_>::Type;
};

// both Function<void()> and Function<void() const> now have 
// the same Signature: void()
Run Code Online (Sandbox Code Playgroud)

原因是它R(Args …

c++ c++11

8
推荐指数
1
解决办法
181
查看次数

C++模板特化/重载

首先,我很抱歉这个问题含糊不清.我不确定如何总结它.

我想要实现的是以下内容,我希望能够将不同类型的模板非类型参数传递给同一个类模板,从而产生不同的实例化.像这样的东西:

Foo<1>();
Foo<'1'>(); // different types of object
Run Code Online (Sandbox Code Playgroud)

我不认为这是可能的,因此我不得不做这样的事情

template <typename T, T Val>
struct Foo;

template <int Val>
struct Foo<int, Val> 
{};

template <char Val>
struct Foo<char, Val>
{};

//...

Foo<int, 1>();
Foo<char, '1'>();
Run Code Online (Sandbox Code Playgroud)

这样Foo可以基于第一模板参数进行专门化.然而,这使我试图在我的元编程框架中实现的迷你语言的语法复杂化.有没有可以让我区分Foo<1>的技术Foo<'1'>?基本上我想要做的是设置一个编译时标志(在枚举中)来指示一个int或多个char传递,而不是明确指定它们.

编辑 答案让我意识到我的问题暗示我实际上需要(编译时)这些对象的实例.我不...

说,不知怎的,标准将允许我重载类模板,以便Foo<1>Foo<'1'>不同类型的,并且包含不同值的flag字段.然后可以将这些类型传递给另一个类模板,该模板可以检查它们并使用它做有趣的事情,例如:

template <typename FooType>
struct Bar
{
    typedef typename If < FooType::flag, int, char >::Type Type;
};
Run Code Online (Sandbox Code Playgroud)

当你没有明确地反对传递类型时,这一切都很容易做到,但这似乎是多余的......

c++ templates specialization non-type

6
推荐指数
1
解决办法
287
查看次数

C++ 11:模板参数中的SFINAE,GCC vs Clang

我想实现一个小的trait类来确定一个类型是否已operator()正确重载,以便我可以查询类似的类型:

FunctorCheck<F, void(int, char)>::value
Run Code Online (Sandbox Code Playgroud)

最初,我对如何从这个问题实现这个问题有了一个想法,但在看了一篇关于TMPCppcon讲座之后,我突然意识到这个问题可以更优雅地解决.这就是我想出来的,它在Clang 3.5.0上编译并运行完美:

template <typename ...>
using void_t = void;

template <typename Functor, typename ... Args>
using FunctorReturn = decltype(declval<Functor>()(declval<Args>()...));

template <typename Functor, typename Signature, typename = void>
struct FunctorCheck: public std::false_type
{};

template <typename Functor, typename R, typename ... Args>
struct FunctorCheck<Functor, R(Args...), 
    void_t<FunctorReturn<Functor, Args ...>> // SFINAE can kick in here
> : public std::is_same<R, FunctorReturn<Functor, Args ...>>::type
{};
Run Code Online (Sandbox Code Playgroud)

您可能已经注意到,我正在使用建议的C++ 17 void_t在专业化的模板参数中利用SFINAE.当FunctorReturn收到 …

gcc templates clang sfinae c++11

6
推荐指数
1
解决办法
802
查看次数

C++ 11:消除多重继承中的类成员的歧义

假设我有这个可变参数的基类模板:

template <typename ... Types>
class Base
{
public:
    // The member foo() can only be called when its template 
    // parameter is contained within the Types ... pack.

    template <typename T>
    typename std::enable_if<Contains<T, Types ...>::value>::type
    foo() {
        std::cout << "Base::foo()\n";
    }
};
Run Code Online (Sandbox Code Playgroud)

foo()只有在其template-parameter至少匹配其中一个参数Base(Contains此帖子底部列出的实现)时,才能调用该成员:

Base<int, char>().foo<int>(); // fine
Base<int, char>().foo<void>(); // error
Run Code Online (Sandbox Code Playgroud)

现在我使用非重叠类型定义一个从Base继承两次的派生类:

struct Derived: public Base<int, char>,
                public Base<double, void>
{};
Run Code Online (Sandbox Code Playgroud)

我希望在打电话的时候

Derived().foo<int>();
Run Code Online (Sandbox Code Playgroud)

编译器会找出要使用的基类,因为它是不包含的基类的SFINAE int.然而,GCC 4.9和Clang 3.5都抱怨模糊的电话.

我的问题是双重的:

  1. 为什么编译器无法解决这种歧义(一般兴趣)? …

c++ multiple-inheritance ambiguity enable-if c++11

6
推荐指数
1
解决办法
1479
查看次数

I2C onReceive-handler仅调用一次

我在Arduino之间通过I2C进行通信时遇到了麻烦.出于某种原因,onReceive处理程序只被调用一次.

主码(发件人):

#include <Wire.h>                                                                     
#include "i2csettings.h" // defines address

void setup()
{
    Wire.begin(I2C_MASTER_ADDRESS);
}

void loop()
{                   
    Wire.beginTransmission(I2C_SLAVE_ADDRESS); 
    Wire.write(0x11);
    Wire.endTransmission();

    delay(1000);       
}
Run Code Online (Sandbox Code Playgroud)

奴隶代码(接收者):

#include <Wire.h>
#include "i2csettings.h"

void takeAction(int);

void setup()
{
    Serial.begin(9600);

    Wire.begin(I2C_SLAVE_ADDRESS);
    Wire.onReceive(takeAction);
}

void loop()
{} 

void takeAction(int nBytes)
{
    Serial.println("Action!");
}
Run Code Online (Sandbox Code Playgroud)

这个测试设置的想法是让发送者每秒发送一个字节,让接收者通过打印消息来对此进行操作.但是,该消息仅打印一次.当我重置奴隶时,它再次打印,但只打印一次.

有什么想法可能来自哪里?

arduino i2c

5
推荐指数
1
解决办法
1320
查看次数

C预处理程序:构建路径字符串

给定一个先前定义的宏:

#define FILENAME somefile.h
Run Code Online (Sandbox Code Playgroud)

我想将它与另一个宏字符串连接起来,该宏字符串定义此文件的(相对)路径。我当前的方法是这样做的:

#define DIRECTORY ../somedir/

#define STRINGIFY_(x) #x
#define FILE2_(dir, file) STRINGIFY_(dir ## file)
#define FILE_(dir, file) FILE2_(dir, file)

#include FILE_(DIRECTORY, FILENAME)
Run Code Online (Sandbox Code Playgroud)

但是,这会导致错误(GCC4.9):

错误:粘贴“ /”和“文件”没有给出有效的预处理令牌

DIRECTORY定义中删除最后的正斜杠可消除此错误,但显然不会产生所需的结果。当我尝试以/其他方式走私时,也会出现类似的错误。例如:

#define FILE2_(dir, file) STRINGIFY_(dir ## / ## file)
Run Code Online (Sandbox Code Playgroud)

由于相同的原因而无法正常工作。

我想知道这里出了什么问题,显然是如何避免这一点。

编辑:在哥伦布的建议下,将双下划线改为单打。显然,包含双下划线的标识符将保留给实现,而不管它们出现在什么地方(我的印象是,仅对ID开头的双下划线成立)。

c macros include c-preprocessor

5
推荐指数
1
解决办法
1486
查看次数

很棒的 WM:在不改变布局的情况下重新排列窗口

我对 Awesome 和 Lua 完全陌生,但我想要实现的是在同一窗口布局中循环浏览窗口的不同排列。也许我没有使用正确的搜索词,但简单的 Google 搜索并没有产生任何有用的结果,而且我不想花时间研究 Lua API 从头开始​​自己做。

假设我有 3 个图块,按任意顺序排列:

+------+-------+
|      |       |
|      |       |
+------+       |
|      |       |
|      |       |
+------+-------+
Run Code Online (Sandbox Code Playgroud)

现在,我想轻松地使我关注的窗口出现在右侧大图块中,而无需使用 Super-Space 循环浏览所有不同的布局。

关于如何实现这一目标有什么想法吗?

layout lua awesome-wm

4
推荐指数
1
解决办法
3447
查看次数

令人敬畏的WM:移动/调整最大化的浮动窗口

在浮动布局中,或者当窗口浮动在任何其他布局中时,在最大化时不可能移动/调整它们的大小.然而,我希望能够将它们从最大化状态拖出/调整大小.这似乎不起作用:

awful.button({ modkey }, 1, 
    function (c) 
        -- I added the if-statement
        if c.maximized then
            c.maximized_horizontal = false
            c.maximized_vertical = false
        end

        awful.mouse.client.move(c)
    end
)
Run Code Online (Sandbox Code Playgroud)

有没有人遇到这个或类似的东西?

lua maximize-window awesome-wm

4
推荐指数
1
解决办法
3408
查看次数

有人熟悉“实现/内部标头”(*.ih)吗?

在 FB Brokken(The C++ Annotations 的作者)的半年 C++ 课程中,我们学习了所谓的实现头文件的使用。我知道这是弗兰克的约定,但我实际上从未在其他任何地方见过它。因此,我将解释这个概念,我很好奇其他人对此有何看法。

这个想法是,您只需将#include类成员的实现(假设您没有编写类内定义)的实现所需的所有指令放在一个文件中,.ih 实现标头和#include每个源中的此文件文件代替。替代方案是
1)#include类头中的所有内容或
2)#include每个源文件中单独的所有头。

这两种替代方案的缺点是显而易见的:
1a)#include在添加需要一些额外#include' 的任何内容后,您必须重新编译所有包含此标头的源。
1b) 你的头文件,应该是你的类的一个清晰的界面,被一大堆#include指令污染了,用户不知道它们是用来做什么的,他也不关心。2a) 您必须#include在每个源文件中一次又一次地使用相同的标题。
2b) 你的实现被所有这些污染了#include,让它看起来有点乱。

只是要清楚:

/* someclass.h(pp) */

#ifndef SOME_CLASS_H
#define SOME_CLASS_H

class SomeClass
{
    //some private data members
    public:
        SomeClass();
        void sayHi() const;
        // some more member functions
    private:
        // some private member functions
};

#endif

/* someclass.ih */

#include "someclass.h"
#include <iostream>
#include <vector> …
Run Code Online (Sandbox Code Playgroud)

c++ implementation header internal include

2
推荐指数
1
解决办法
3092
查看次数

处理其他信号时等待信号

我的Qt应用程序与串行设备通信,偶尔必须等待此设备发送一个字节.为了实现这一点,我创建了一个新的eventloop,一旦串行缓冲区中有可用信息就会退出:

unsigned char MyClass::waitForDevice(int timeout)
{
    QEventLoop wait;
    connect(d_serial, SIGNAL(readyRead()), &wait, SLOT(quit()));
    if (timeout > 0)
        QTimer::singleShot(timeout, &wait, SLOT(quit()));

    wait.exec();
    return static_cast<unsigned char>(d_serial->read(1)[0]);
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当应用程序在等待时,即在eventloop运行时,我需要能够在GUI中按下按钮时与串行设备进行通信.天真地,我尝试将信号连接到执行此操作的插槽,但我发现插槽仅 eventloop终止执行.

我试着,没有任何运气,有一个单独的QThread运行调用qApp->processEvents()无限循环,当eventloop终止时终止.这没用,我不太清楚为什么不呢.解决这个问题的规范方法是什么?

c++ qt

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