我有一个小的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)
在某些情况下被激活.
所以我的问题是:
使用堆栈分配的对象在异构向量中存储对象
你好,
假设我有一个抽象类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
我需要做一些强大的数据拟合操作.
我有一堆(x,y)数据,我想要适合高斯(又名正常)函数.关键是,我想删除ouliers.正如可以在下面的示例图中看到的那样,还有另一个数据分布在右边污染我的数据,我不想考虑它来进行拟合(即找到\ sigma,\ mu和整体规模参数).

R似乎是适合这项工作的工具,我发现了一些与稳健拟合相关的软件包(健壮,强大的基础,例如MASS).
但是,他们假设用户已经非常了解R,这不是我的情况,文档仅作为一种参考手册提供,没有教程或同等学历.我的统计背景相当低,我试图阅读关于拟合R的参考资料,但它并没有真正帮助(我甚至不确定这是正确的方法).但我觉得这实际上是一个非常简单的操作.
我已经检查了这个相关的问题(以及链接的问题),但是它们将单个矢量值作为输入,并且我有一对矢量,所以我看不到如何转置.
任何有关如何做到这一点的帮助将不胜感激.
我正在开发一个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)吗?但是,我怎么能将该控制台与我的应用程序"连接"?
我需要在一个元素中旋转元素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) 我开始使用"Catch"单元测试框架,到目前为止它真的很棒.我使用VS内置单元测试框架,非常痛苦.
有一件事我注意到宏REQUIRE_THROWS_AS不像人们期望的那样表现
来自文档:
Run Code Online (Sandbox Code Playgroud)REQUIRE_THROWS_AS( expression, exception type ) and CHECK_THROWS_AS( expression, exception type )期望在评估表达式期间抛出指定类型的异常.
当我试着写
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)
我希望测试失败,但它说测试通过了.框架中有错误还是我错了?
我很难理解它是如何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)
但这失败了,请参阅现场演示。
我怎样才能编写一个允许这样做的构造函数?这可能吗?
我有一个cv::Mat,我想做一些每元素操作.例如,我有一个浮点矩阵cv::Mat m(100,100, CV_64F);.我有另一个功能如下:
double fun(double elem);
Run Code Online (Sandbox Code Playgroud)
如何将此函数应用于矩阵,该矩阵可以执行每个元素的操作.
我有一个基本的抽象类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++ ×8
c++11 ×2
abstract ×1
algorithm ×1
c ×1
console ×1
data-fitting ×1
inheritance ×1
iterator ×1
linux ×1
matrix ×1
mingw ×1
opencv ×1
ostream ×1
overloading ×1
polymorphism ×1
r ×1
testing ×1
unit-testing ×1
vector ×1
virtual ×1