以下简单的代码编译,虽然我不明白为什么:
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在上面的代码中不被认为是不完整的,在哪里A和B都被声明和定义C?
我正在尝试使用不同的表执行 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) 我们收到了来自分包商的代码,该代码主要执行以下操作:
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++代码:
#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号线,在定义A的operator=()功能是,是畸形......或者,至少,我相信如此.正如预期的那样,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=()必须如何声明和定义函数.
我在 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 文件,它将失败。
我该如何解决这个问题?
我的 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) 我正在尝试使用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)