小编keb*_*ebs的帖子

为什么Mingw在编译时更改了我的标识符名称?

我有一个小的C++库,在Linux上编译很好(这是我的主要开发平台).现在我正在尝试使用Mingw在Windows机器(XP3)上构建它,并且由于无法解释的错误,编译失败.例如,假设在类AAA中,在命名空间aaa中有以下方法,在文件aaa.h中声明:

void AAA::DrawText( foo z );
Run Code Online (Sandbox Code Playgroud)

在编译文件aaa.cpp(当然包含方法实现)时,我收到以下错误:

D:\dev\[...]\aaa.cpp:644: error: no 'void aaa::AAA::DrawTextA( foo z )' member function declared in class 'aaa::AAA'
Run Code Online (Sandbox Code Playgroud)

是的,你得到了它,没有错误 ...编译器误读了函数名称,并在函数标识符中添加了一个字母!

这完全不在我的理解之下.在Linux上从未遇到过这样的问题.mingw/Gcc如何更改标识符?

名字错了吗?不,这在编译后发生.

我当然检查了确切的命令行(我使用IDE):没有错:

mingw32-g++.exe -W  -O3 -Wall    -I..\include -I"C:\program files\OpenCV2.1\include\opencv"  -c D:\dev\...\aaa.cpp -o ..\obj\Release\src\aaa.o
Run Code Online (Sandbox Code Playgroud)

但是:如果我将函数重命名为DrawTxt(),那么一切都很顺利(但我不能这样做).这对我来说意味着标识符已在某处定义.Opencv lib?掠过树,什么也没找到......是的,我搜索了当前的包含文件夹,没有任何关闭.

我看到的另一个解决方案是某处(?)宏像:

#define DrawText DrawTextA
Run Code Online (Sandbox Code Playgroud)

在某些情况下被激活.

所以我的问题是:

  • 在我的代码中是否还有其他可能的名称替换?对我来说,宏是唯一的方法,如果标识符已在其他地方声明,它只会抛出一个错误,编译器不能(好吧......)匆匆地改变/替换/编辑标识符.
  • 我该如何追踪问题?

c++ mingw

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

使用堆栈分配的对象在向量中存储异构对象

使用堆栈分配的对象在异构向量中存储对象

你好,

假设我有一个抽象类CA,派生到CA1,CA2和其他人.

我想将这些派生类型的对象放入一个向量中,我将其嵌入到类CB中.为了使多态性正确,我需要存储一个指针向量:

class CB
{
    std::vector <CA*> v;
};
Run Code Online (Sandbox Code Playgroud)

现在,说我有以下主要功能:

int main()
{
    CB b;
    CA1 a1;
    CA2 a2;
    b.Store( a1 );
    b.Store( a2 );
}
Run Code Online (Sandbox Code Playgroud)

如何void CB::Store(const CA&)以简单的方式编写方法,因此存储的对象在原始对象被销毁时仍然存在(在上面的简单示例中不会发生).

我的问题是我需要先在堆上复制对象,然后才能在向量中复制它们的地址,但是如何创建派生类型的对象呢?当然,我可以使用RTTI,搜索所有可能的类型,创建和分配指针,并在将对象推入向量之前将对象复制(通过适当的转换)到已分配的空间中.但这看起来很复杂,不是吗?

有更简单的方法吗?

(并且不使用主要的动态分配!)

c++ polymorphism inheritance vector dynamic-memory-allocation

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

R:将数据点稳健拟合到高斯函数

我需要做一些强大的数据拟合操作.

我有一堆(x,y)数据,我想要适合高斯(又名正常)函数.关键是,我想删除ouliers.正如可以在下面的示例图中看到的那样,还有另一个数据分布在右边污染我的数据,我不想考虑它来进行拟合(即找到\ sigma,\ mu和整体规模参数). 样本数据图

R似乎是适合这项工作的工具,我发现了一些与稳健拟合相关的软件包(健壮,强大的基础,例如MASS).

但是,他们假设用户已经非常了解R,这不是我的情况,文档仅作为一种参考手册提供,没有教程或同等学历.我的统计背景相当低,我试图阅读关于拟合R的参考资料,但它并没有真正帮助(我甚至不确定这是正确的方法).但我觉得这实际上是一个非常简单的操作.

我已经检查了这个相关的问题(以及链接的问题),但是它们将单个矢量值作为输入,并且我有一对矢量,所以我看不到如何转置.

任何有关如何做到这一点的帮助将不胜感激.

r data-fitting

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

从app打开控制台

我正在开发一个C和C++应用程序,它使用一些图形引擎来处理gtk窗口(Opencv/highgui).这个应用程序对stdout/cout做了一些小的输出.

在Windows上,从桌面启动这种应用程序会自动打开一个控制台,向用户显示标准输出上写的内容,或者使用"printf()"或"std :: cout".

在Linux上,如果我从之前打开的控制台启动它,没问题.但是,如果我通过桌面(双击)启动它,那么linux不会打开关联的控制台,并且在stdout/cout上写入的数据会丢失.似乎这是Linux上的正常行为(?).

在linux平台上编译时,我想从我的应用程序中自动打开一个控制台.

这似乎是这一个的愚蠢,重点是,它不起作用!我目前有以下代码:

#ifndef __WIN32
   filebuf* console = new filebuf();
   console->open( "/dev/tty", ios::out );
   if( !console->is_open() )
       cerr << "Can't open console" << endl;
   else
       cout.ios::rdbuf(console);
#endif
Run Code Online (Sandbox Code Playgroud)

(使用freopen()将cerr重定向到文件中)

我一直在"无法打开控制台".我尝试更换控制台名称:

console->open( "/dev/console", ios::out );
Run Code Online (Sandbox Code Playgroud)

但这并没有改变.

我是朝着正确的方向吗?我接下来可以尝试什么?我应该尝试专门打开终端应用程序(xterm)吗?但是,我怎么能将该控制台与我的应用程序"连接"?

c c++ linux console

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

C++:在迭代器之间计算距离上的类型混淆

我需要在一个元素中旋转元素std::vector,使它在第一个重复元素的开头保存.为了更清楚,如果我有:

1 2 3 4 5 6 3 7 8
Run Code Online (Sandbox Code Playgroud)

然后我想:

3 4 5 6 3 7 8 1 2   
Run Code Online (Sandbox Code Playgroud)

好的,让我们使用std::rotate(),并构建一个函数来获得第一个重复的位置:

int main() {
   std::vector<int> v = { 1,2,3,4,5,6,3,7,8 };
   auto it = FindFirstDuplicate(v);
   cout << "first dupe is " << *it << " at " << it - v.begin() << endl;
   std::rotate( v.begin(), it, v.end() );
}
Run Code Online (Sandbox Code Playgroud)

该任务的想法是逐个存储新向量中的元素,直到我发现我要添加的元素已经在这个新向量中.

但我偶然发现了迭代器问题,因此无法编译.我对不同迭代器的类型以及const/non const迭代器问题感到困惑.

这是我目前的代码,在线尝试(跳过std::可读性):

template<typename T>
typename vector<T>::iterator FindFirstDuplicate( const vector<T>& v )
{ …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm iterator c++11

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

"Catch"单元测试框架 - REQUIRE_THROWS_AS

我开始使用"Catch"单元测试框架,到目前为止它真的很棒.我使用VS内置单元测试框架,非常痛苦.

有一件事我注意到宏REQUIRE_THROWS_AS不像人们期望的那样表现

来自文档:

REQUIRE_THROWS_AS( expression, exception type ) and
CHECK_THROWS_AS( expression, exception type )
Run Code Online (Sandbox Code Playgroud)

期望在评估表达式期间抛出指定类型的异常.

当我试着写

TEST_CASE("some test") {
    SECTION("vector throws") {
        std::vector<int> vec;
        REQUIRE_THROWS_AS(vec.at(10), std::logic_error);
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望测试失败,但它说测试通过了.框架中有错误还是我错了?

c++ testing unit-testing catch-unit-test

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

构造函数中的初始化列表问题

我很难理解它是如何std::initializer_list工作的。我检查了其他问题,但没有发现任何相关内容(或者也许我没有看到它?)。

假设我有这个:

template<typename T> 
struct Point
{
    T x,y;
};

template<typename T> 
struct A
{
    std::vector<Point<T>> v;
};
Run Code Online (Sandbox Code Playgroud)

然后我可以构建:

int main()
{
   A<int> a{ std::vector<Point<int>> { {4,4}, {5,5},{6,6} } };
}
Run Code Online (Sandbox Code Playgroud)

但我想让事情变得更简单,所以我可以写:

int main()
{
   A<int> a( { {4,4}, {5,5},{6,6} } );
}
Run Code Online (Sandbox Code Playgroud)

我试过:

template<typename T> 
struct A
{
    std::vector<Point<T>> v;
    template<typename U>
    A( const std::initializer_list<Point<U>>& il ) : v{il}
    {}
};
Run Code Online (Sandbox Code Playgroud)

但这失败了,请参阅现场演示

我怎样才能编写一个允许这样做的构造函数?这可能吗?

c++ initializer-list c++11 stdinitializerlist

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

Opencv矩阵每元素操作

我有一个cv::Mat,我想做一些每元素操作.例如,我有一个浮点矩阵cv::Mat m(100,100, CV_64F);.我有另一个功能如下:

double fun(double elem);
Run Code Online (Sandbox Code Playgroud)

如何将此函数应用于矩阵,该矩阵可以执行每个元素的操作.

c++ opencv matrix

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

抽象类重载ostream运算符

我有一个基本的抽象类Base.

class Base
{
protected:
    string m_Name;
public:
    virtual string Name() { return m_Name; }
    virtual string Type() = 0;
    virtual bool isEqual(Base* rhs) = 0 ;
    //virtual ostream& operator<< (ostream& out) const;
};
Run Code Online (Sandbox Code Playgroud)

我想重载operator <<显示继承的对象Base.我不能使用void print()函数,因为这些继承的对象Base也有一些只能显示的对象operator <<.

我怎么能超负荷operator <<

c++ virtual overloading abstract ostream

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