小编vil*_*apx的帖子

C++在类中转发声明类

以下简单的代码编译,虽然我不明白为什么:

class C {
    class B;

    class A {
        B getB() { return B(); }
    };

    class B {
    };
};

int main(int, char**)
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我然后注释掉" class C"东西,那么前向声明B,定义A和定义B不再嵌套在类中,代码不会编译,因为B它是一个不完整的类型:

main.cpp: In member function 'B A::getB()':
main.cpp:6: error: return type 'struct B' is incomplete
main.cpp:6: error: invalid use of incomplete type 'struct B'
main.cpp:3: error: forward declaration of 'struct B'
Run Code Online (Sandbox Code Playgroud)

我理解一个类型不完整的含义,即它尚未定义,因此编译器不可能知道为它分配多少空间.但是为什么B在上面的代码中不被认为是不完整的,在哪里AB都被声明和定义C

c++

17
推荐指数
3
解决办法
1340
查看次数

如何使用pyscopg2的异步功能?

我正在尝试使用不同的表执行 3 个不同的 postgresql 查询。每个查询需要 2 秒来执行。我想知道是否可以同时运行所有 3 个查询,以便我可以节省 4 秒。我尝试使用的异步功能,pyscopg2但它只返回上次查询的结果。谁能指出我做错了什么?

import select
import psycopg2
import psycopg2.extensions

def wait(conn):
    while 1:
        state = conn.poll()
        if state == psycopg2.extensions.POLL_OK:
            break
        elif state == psycopg2.extensions.POLL_WRITE:
            select.select([], [conn.fileno()], [])
        elif state == psycopg2.extensions.POLL_READ:
            select.select([conn.fileno()], [], [])
        else:
            raise psycopg2.OperationalError("poll() returned %s" % state)


aconn = psycopg2.connect(
  dbname=pg_name,
  user=pg_username,
  host=pg_host,
  password=pg_password,
  async=1)

wait(aconn)
acurs = aconn.cursor()

acurs.execute(
              "SELECT 1;"
              "SELECT ST_Length(ST_GeomFromText"
              "('LINESTRING(743238 2967416,743238 2967450)',4326));"
              "SELECT 3;"
             )
wait(acurs.connection)
result = acurs.fetchall()
print …
Run Code Online (Sandbox Code Playgroud)

postgresql asynchronous postgis psycopg2

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

按值传递可调用对象,将其分配给指针成员

我们收到了来自分包商的代码,该代码主要执行以下操作:

class Callable
{
public:
    void operator()(int x)
    {
        printf("x = %d\n", x);
    }
};

template<typename T>
class UsesTheCallable
{
public:
    UsesTheCallable(T callable) :
            m_callable(NULL)
    {
        m_callable = &callable;
    }

    ~UsesTheCallable() {}

    void call() { (*m_callable)(5); }

private:
    T* m_callable;
};
Run Code Online (Sandbox Code Playgroud)

这让我觉得是未定义的代码......他们将Tby值传递给UsesTheCallable构造函数然后将m_callable成员分配给参数的地址,这应该超出构造函数末尾的范围,所以我随时调用UsesTheCallable::call(),在对不再存在的物体采取行动.

所以我尝试了这个主要方法:

int main(int, char**)
{
    UsesTheCallable<Callable>* u = NULL;

    {
        Callable c;
        u = new UsesTheCallable<Callable>(c);
    }

    u->call();

    delete u;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我确保Callable在调用之前对象超出了范围UsesTheCallable::call(),所以我应该在内存上调用我当时并不拥有的函数.但代码有效,Valgrind报告没有内存错误,即使我将一些成员数据放入 …

c++

6
推荐指数
2
解决办法
274
查看次数

在G ++ 4.4.7中"命名构造函数,而不是类型"

我有以下简单的C++代码:

#include <cstdio>

class A
{
public:
    A(int y) : x(y) {}
    A& operator=(const A& rhs);
    int x;
};

A::A& A::operator=(const A& rhs) { this->x = rhs.x; return *this; }

int main(int, char**)
{
    A a1(5);
    A a2(4);

    printf("a2.x == %d\n", a2.x);

    a2 = a1;

    printf("a2.x == %d\n", a2.x);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

11号线,在定义Aoperator=()功能是,是畸形......或者,至少,我相信如此.正如预期的那样,G ++ 4.7.4以及我尝试过的每个较新版本的GCC都会引发以下错误:

main.cpp:11:1: error: ‘A::A’ names the constructor, not the type
Run Code Online (Sandbox Code Playgroud)

奇怪的是,G ++ 4.4.7成功地编译了这个程序,没有任何警告,甚至打印4和5,正如预期的那样,如果第11行被正确写入(即只是A&代替A::A&).

有人可以帮我解释G ++ 4.4.7究竟发生了什么吗?这只是该版本中的一个错误(虽然是一个非常古老的错误,但仍然使用它我们感到羞耻)?我认为标准将明确说明operator=()必须如何声明和定义函数.

c++ gcc

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

如何将 .tar.gz 文件打包成 rpm 包


我在 Redhat Linux 上工作过,我有一个 tar.gz 文件。我想把这个 tar.gz 文件打包成一个 rpm 包文件。
在rpm包阶段,我只是想解压tar.gz文件,把所有的人员打包到rpm包中,当我在linux服务器上安装rpm包时,它只会简单地将所有文件复制到目标文件夹中.
我已经尝试了很多。这是我的 SPEC 文件的一些代码,但它有问题:

%prep

%build
pwd

%install

rm -rf /usr/local/sample
mkdir /usr/local/sample
cd %{_sourcedir}
tar -xzvf sample.tar.gz -C /usr/local/sample

%clean
rm -rf %{buildroot}

%files
%defattr(-,root,root,-)
%doc

%changelog
Run Code Online (Sandbox Code Playgroud)

我可以成功打包rpm文件,但是rpm包中没有tar.gz文件的内容。
如果我在其他服务器上安装 rpm 文件,它将失败。
我该如何解决这个问题?

rpm rpmbuild rpm-spec

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

MariaDB 服务器在 600 秒后客户端连接超时

我的 MariaDB 服务器在 600 秒(10 分钟)不活动后使我的 C++ 客户端(使用 libmariadb)超时,我不确定为什么,因为我找不到任何指定该数字的已配置超时。

这是我的代码,我在其中执行一个简单的 SELECT 查询,等待 11 分钟,然后再次运行相同的查询并收到“服务器消失”错误:

#include <iostream>
#include <unistd.h>

#include <errmsg.h>
#include <mysql.h>

int main(int, char**)
{
    // connect to the database
    MYSQL* connection = mysql_init(NULL);
    my_bool reconnect = 0;
    mysql_options(connection, MYSQL_OPT_RECONNECT, &reconnect);  // don't implicitly reconnect
    mysql_real_connect(connection, "127.0.0.1", "testuser", "password",
                       "my_test_db", 3306, NULL, 0);

    // run a simple query
    mysql_query(connection, "select 5");
    mysql_free_result(mysql_store_result(connection));
    std::cout << "First query done...\n";

    // sleep for 11 minutes
    sleep(660);

    // run the query again
    if(! …
Run Code Online (Sandbox Code Playgroud)

mysql sql database libmysql mariadb

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

Boost.Asio:不能使用std :: bind()来指定回调

我正在尝试使用Boost.Asio的async_read_until()自由函数,但是我无法将成员函数指定为回调函数std::bind().我可以毫不费力地将这个习惯用于其他Boost.Asio函数,所以我很困惑为什么它不起作用async_read_until().

这是我的例子:

#include <functional>
#include <boost/asio.hpp>
#include <boost/bind.hpp>

class Test
{
public:
    boost::asio::streambuf buf;
    boost::asio::ip::tcp::socket sock;

    Test(boost::asio::io_service& io) :
        sock(io)
    {
    }

    void readComplete(const boost::system::error_code& error,
                      std::size_t bytesTransferred)
    {
    }

    void invoke()
    {
        boost::asio::async_read_until(sock,
                                      buf,
                                      '\n',
                                      std::bind(&Test::readComplete,
                                                this,
                                                boost::asio::placeholders::error,
                                                boost::asio::placeholders::bytes_transferred));
    }
};

int main(int argc, char** argv)
{
    boost::asio::io_service io;
    Test t(io);

    t.invoke();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译失败并出现以下错误(以及其他template-compiler-error-barf):

In file included from /home/me/eclipse-workspace/practice/main.cpp:4:
In file included from /usr/include/boost/asio.hpp:91:
In file included from /usr/include/boost/asio/read_until.hpp:921:
/usr/include/boost/asio/impl/read_until.hpp:707:3: error: …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-asio c++11

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