小编use*_*462的帖子

检查main的退出状态

我正在从我的 Java 代码调用包含在同一文件夹中的 .class 的主类。该 main 是无效的,我想通过检查其退出状态来检查它是否成功:

    ...
    String[] arguments = new String[]{"a", "b"};
    AnotherClass.main(arguments);
    ...
Run Code Online (Sandbox Code Playgroud)

关于如何的任何想法,即 AnotherClass.main(arguments); 不返回任何东西?

谢谢你。

java

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

由于无符号,在模板化方法中删除警告

我找到了一些模板化的代码,在某些时候执行以下检查:

template<class IntegralType>
void randomFunction(IntegralType t)
{
    ...
    if (t < 0)
    ...
}
Run Code Online (Sandbox Code Playgroud)

代码的概念t是整数类型(有符号或无符号).无论签名如何,代码都可以正常工作,但编译器会发出警告,因为在unsigned整数的情况下,检查将始终为true.

在C++ 03中有没有办法修改代码以摆脱警告而不抑制它?我正在考虑T以某种方式检查签名,不知道它是否可能.

我知道C++ 11,is_signed但我不确定它是如何在C++ 03中实现的.

c++ templates compiler-warnings c++03

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

在自己上调用复制构造函数

我很好奇我在这段代码中发生的事情几乎是错误地写的:

#include <iostream>

class Test
{
public:
  Test() {
    std::cout << "Default constructor";
    a= 10;
  }
  int a;
};

int main() {
  Test obj(obj);
  std::cout << obj.a << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它在gcc中编译而没有任何警告(使用-Wall -Werror).执行它只打印垃圾.

如果我没有弄错的话,这就是调用隐式的拷贝构造函数,而不是初始化.我很好奇复制构造函数在这种情况下会做什么,但gdb不会在该行中停止(设置为该行的断点跳转到下一行).

如果将"复杂"属性添加到类中(例如a std::string),一切都会中断,可能是因为'='运算符如何为这些类重载.

我的假设是否正确?为什么gdb不会停在该行?为什么在使用未初始化的对象调用复制构造函数时没有警告?

c++ gdb copy-constructor

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

声明模板函数以接受任何容器,但只接受一个包含类型

我想声明的是接受不同的STL容器的功能,但它们必须包含特定的类的对象(例如,它应该接受std::vector<double>std::deque<double>,但没有std::vector<std::string>).

我已经找到了模板容器和包含类型的答案,但我试图调整它们以便修复包含的类型是不成功的.

c++ templates stl

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

检测模板类型本身是模板类型

我正在编写一个负责格式化和打印信息的方法.

有一个问题/功能boost::optional<T>,当输出到流时,只有当有值时才会输出额外的空格optional.

我可以看到两个选项:

  • 使用两个不同的功能:一般和一个明确处理 boost::optional<T>
  • 使用单个函数可以检测参数是否为类型boost::optional<T>并相应地处理它

选项1可能是这样的:

template <typename T>
void print(const T& o)
{
    std::cout << o << "\n";
}

template <typename T>
void print_optional(const boost::optional<T>& o)
{
    if (o)
        print(*o);
    else 
        print("--");
}
Run Code Online (Sandbox Code Playgroud)

它有效,但它有一个问题,如果我们调用print()一个没有编译错误boost::optional.我知道static_assert并且std::is_type,但由于boost::optional本身是模板化的,我不知道如何检查它.

选项2对我来说是理想的,但问题仍然存在:如何询问代码变量boost::optional<T>是否与T无关?

c++ templates boost types

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

当更多信息被打印到屏幕上时,使boost :: progress_display工作

我有一个控制台程序,该程序可能需要一些时间进行计算。我正在boost::progress_display向用户提供一些反馈。

我的问题是,如果发生某些情况,我还想将其他更新打印到标准输出,这会中断进度栏:

0%   10   20   30   40   50   60   70   80   90   100%
|----|----|----|----|----|----|----|----|----|----|
**Found temporary candidate with score: 40
Found temporary candidate with score: 46
*Found temporary candidate with score: 52
********Found temporary candidate with score: 55
**Found temporary candidate with score: 67
**************************************
Run Code Online (Sandbox Code Playgroud)

是否有一种简单的方法来拥有进度条(理想情况下,在代码中与之一样是非侵入式的boost::progress_display)和更新屏幕?

编辑:在评论中的一条建议说我还没有提供我要寻找的示例之后,我想要看起来像这样的代码:

boost::progress_display progress(10);
for (size_t i = 0; i< 10; ++i)
{
    std::cout << "Number is: " << i << "\n";
    ++progress;
}
Run Code Online (Sandbox Code Playgroud)

但这不会导致以下输出:

0%   10   20   30   40 …
Run Code Online (Sandbox Code Playgroud)

c++ boost progress-bar

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

为什么动态链接时g ++会检测到未定义的引用

我可能对动态链接的工作方式感到误解,因为我无法弄清楚。据我了解,动态链接库时,其符号在运行时解析。从这个答案:

当您动态链接时,可执行文件中将包含指向要链接的文件的指针(例如,文件的文件名),并且链接时不包含该文件的内容。只有当您以后运行该可执行文件时,这些动态链接的文件才被购买,并且它们仅被购买到该可执行文件的内存中副本中,而不是磁盘中的一个副本中。

[...]

在动态情况下,主程序与C运行时导入库(声明动态库中的内容但未实际定义的内容)链接在一起。即使实际的代码丢失,这也允许链接器链接。

然后,在运行时,操作系统加载程序将主程序与C运行时DLL(动态链接库或共享库或其他命名法)进行后期链接。

我对为什么g++动态链接到共享对象时似乎期望共享对象在那里感到困惑。当然,我希望库的名称是必需的,以便可以在运行时加载它,但是为什么.so在此阶段它是必需的?此外,g++在链接库时,抱怨未定义的引用。

我的问题是:

  1. g++如果库的加载仅在运行时发生,为什么在动态链接共享对象时似乎需要共享对象?我知道-l指定共享对象的名称可能需要该标志,以便可以在运行时加载它,但是我看不出必须提供.so指向链接时间(-L)或.so自身的路径。
  2. 为什么g++在动态链接时尝试解析符号?没有什么可以阻止我.so在链接时完成操作,而是.so在运行时提供一个不同的(不完整的)消息,这会导致程序在尝试使用未定义的符号时崩溃。

我举了一个可重现的例子:

目录结构:

.
??? main.cpp
??? test
    ??? usertest.cpp
    ??? usertest.h
Run Code Online (Sandbox Code Playgroud)

文件内容:

测试/用户测试

#ifndef USERTEST_H_4AD3C656_8109_11E8_BED5_5BE6E678B346
#define USERTEST_H_4AD3C656_8109_11E8_BED5_5BE6E678B346

namespace usertest
{
    void helloWorld();

    // This method is not defined anywhere
    void byeWorld();
};

#endif /* USERTEST_H_4AD3C656_8109_11E8_BED5_5BE6E678B346 */
Run Code Online (Sandbox Code Playgroud)

测试/用户测试.cpp

#include "usertest.h"
#include <iostream>

void usertest::helloWorld()
{
    std::cout << "Hello, world\n"; …
Run Code Online (Sandbox Code Playgroud)

c++ g++ dynamic-linking

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