我遇到了使用Visual Stuido 2010 SP1,cl.exe版本16.0.40219.1编译一些模板代码的问题
以下代码将导致编译器访问违规:
template<typename T>
class A
{
A(){}
};
template<typename T>
class B : public A<T>
{
using A::A(); // Compiler access violates
// **EDIT**
//using A<T>::A<T>; // Compiler succeeds
//using A<T>::A(); // Compiler reports error
};
int main(int argc, char* argv[])
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它会生成以下错误(除了"cl.exe已停止工作,C0000005异常):
1>d:\projects\cpptest\cpptest\cpptest.cpp(11): fatal error C1001: An internal error has occurred in the compiler.
1> (compiler file 'msc1.cpp', line 1420)
1> To work around this problem, try simplifying or changing the program …Run Code Online (Sandbox Code Playgroud) 我有一个关于Spirit Qi的编译问题,它抱怨value_type不是标识符的成员.出于某种原因,Qi的属性系统将标识符视为容器类型,并尝试枚举它的值类型.
这是与此问题类似的问题,但是,我认为原因是单个成员结构,可能与此错误有关.
#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
using namespace boost::spirit::qi;
struct identifier
{
std::wstring name;
};
struct problem
{
identifier _1;
identifier _2;
identifier _3;
};
BOOST_FUSION_ADAPT_STRUCT(
identifier,
(std::wstring, name)
)
BOOST_FUSION_ADAPT_STRUCT(
problem,
(identifier, _1)
(identifier, _2)
(identifier, _3)
)
int main(int argc, char* argv[])
{
rule<std::wstring::const_iterator, identifier()> gr_identifier = eps >> raw[lexeme[(alpha | '_') >> *(alnum | '_')]];
// Ok, compiles
/*rule<std::wstring::const_iterator, problem()> gr_problem = gr_identifier
>> …Run Code Online (Sandbox Code Playgroud) 我们有一个在MFC(VS2010)中通过CDatabase/CRecordset使用ODBC的应用程序.我们实施了两个后端.MSSQL和MySQL.
现在,当我们使用MSSQL(使用Native Client 10.0)时,使用SELECT检索记录通过慢速链接(例如VPN)非常慢.MySQL ODBC驱动程序没有表现出这种令人讨厌的行为.
例如:
CRecordset r(&m_db);
r.Open(CRecordset::snapshot, L"SELECT a.something, b.sthelse FROM TableA AS a LEFT JOIN TableB AS b ON a.ID=b.Ref");
r.MoveFirst();
while(!r.IsEOF())
{
// Retrieve
CString strData;
crs.GetFieldValue(L"a.something", strData);
crs.MoveNext();
}
Run Code Online (Sandbox Code Playgroud)
现在,使用MySQL驱动程序,一切都按预期运行.返回查询,一切都闪电般快.但是,使用MSSQL Native Client,事情会变慢,因为在每个MoveNext()上,驱动程序都与服务器通信.
我认为这是由于服务器端游标,但我没有找到一种方法来禁用它们.我尝试过使用:
::SQLSetConnectAttr(m_db.m_hdbc, SQL_ATTR_ODBC_CURSORS, SQL_CUR_USE_ODBC, SQL_IS_INTEGER);
Run Code Online (Sandbox Code Playgroud)
但这也没有帮助.在SQL事件探查器中,sp_cursorfetch()等仍有长期运行的exec.我还尝试了一个带有SQLAPI和批量提取的小型参考项目,但是在FetchNext()中也会挂起很长时间(即使结果集中只有一条记录).但这只发生在使用LEFT JOINS,表值函数等的查询上. 请注意,查询不会花费那么长时间 - 通过SQL Studio在相同的连接上执行相同的SQL会在合理的时间内返回.
问题1:是否有可能以某种方式获取本机客户端 在本地"缓存"所有结果 使用本地游标的方式与MySQL驱动程序似乎一样吗?
也许这是完全错误的做法,但我不确定如何做到这一点.
我们想要的只是从SELECT中一次检索所有数据,然后再不谈论服务器直到下一个查询.我们不关心记录集更新,删除等或任何废话.我们只想检索数据.我们采用该记录集,获取所有数据并删除它.
问题2:有没有更有效的方法来使用ODBC在MFC中检索数据?
加载kml数据源时,我想显示一个加载图像,直到可以在查看器或场景中将其可视化为止。我试图处理:
viewer.dataSources.dataSourceAdded 事件,但是它很早就触发了,也就是说,加载图像在数据源可以可视化之前就消失了问题是相同的
viewer.dataSources.add(datasource).then(function(){ clearLoader(); } )
请任何人都可以帮助谢谢
假设我有一个我想用Spirit Qi解析的结构,定义如下:
struct data_
{
bool export;
std::wstring name;
data_() : export(false) {}
};
Run Code Online (Sandbox Code Playgroud)
另外,假设结构已适应融合,如下所示:
BOOST_FUSION_ADAPT_STRUCT(
data_,
(bool, export)
(std::wstring, name)
)
Run Code Online (Sandbox Code Playgroud)
相关规则是:
qi::rule<Iterator, data_(), skipper<Iterator> > rule_data;
rule_data = -lexeme["SpecialText" >> !(alnum | '_')] [ boost::phoenix::at_c<0> = true ] // If this string is found, , set "export" to true
> lexeme["Name" >> !(alnum | '_')] // this is supposed to go into the "name" member
Run Code Online (Sandbox Code Playgroud)
到目前为止,这编译得非常好.但是,"名字"现在保持空白!
基本上,我问:鉴于"SpecialText"在"Name"之前,我如何正确地合成"export"的布尔属性,而不是字符串?
编辑 把我的头发拉出来之后,我随机偶然发现了"匹配[]"解析器,这似乎做了我想要的.
尽管如此,问题仍然存在于一般形式中,例如,如果我想返回某个字符串或其他数据类型而不是bool.本质上,如何通过语义操作设置struct属性的特定成员.
编译一些代码,我遇到了编译器错误,这对我来说似乎很奇怪,并且与继承,嵌套类,使用声明和访问修饰符有关.
基本上,目的是使派生类型公开基类型的嵌套受保护类.
以下简短示例来说明问题:
class Base
{
protected:
struct Nested
{
enum value_enum
{
val = 0,
val2,
val3
};
};
};
class Derived : public Base
{
public:
using Base::Nested;
};
int main(int argc, char** argv)
{
//Base::Nested aa; // error, as (I) expected
//Base::Nested::value_enum ab; // error, as (I) expected
Derived::Nested ba; // works, as (I) expected
Derived::Nested::value_enum bb; // MSVC error, as (I) did not expect
return 0;
}
Run Code Online (Sandbox Code Playgroud)
看到现场.
MSVC11(v11.00.61030)对此代码进行了阻塞,并出现以下错误:
错误C2248:'Base :: Nested':无法访问类'Base'中声明的受保护结构
GCC和Clang都正确地编译了这个,因此如果没有引用标准中相关部分的能力,我认为这是一个MSVC错误.
有没有办法解决这个与MSVC?
c++ access-modifiers nested-class compiler-bug visual-studio-2012
我们最近开始使用Boost测试框架,并且到目前为止都喜欢它.但是,如果我们可以向现有帮助程序添加自定义消息,那么某些测试会很棒.
例如,我可以在mytest和mytest2中获取输出,但是找不到在mytest3中获取输出的方法:
#define BOOST_TEST_MODULE mytests
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_SUITE(myunit)
BOOST_AUTO_TEST_CASE(mytest)
{
// This give a nice output [2+2 != 5]
BOOST_CHECK_EQUAL(2+2, 5);
}
BOOST_AUTO_TEST_CASE(mytest2)
{
// This give only a custom output
BOOST_CHECK_MESSAGE(2+2 == 5, "comparison error");
}
BOOST_AUTO_TEST_CASE(mytest3)
{
// Ideally, it should output [2+2 != 5] comparison error
BOOST_CHECK_EQUAL_WITH_ADDITIONAL_MESSAGE(2+2, 5, "comparison error");
}
BOOST_AUTO_TEST_SUITE_END()
Run Code Online (Sandbox Code Playgroud)
我想要这个的原因是因为如果我希望有这样的测试用例:
BOOST_AUTO_TEST_CASE(mytest4)
{
for(int i = 0; i < 10; ++i)
{
BOOST_CHECK_EQUAL_WITH_ADDITIONAL_MESSAGE(i%3, 0, i);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,无法知道测试失败的原因.
我试图"复制"BOOST_CHECK_EQUAL宏,如下所示希望boost会附加到传递的消息,因为原始宏传递一个空的文字:
#define BOOST_CHECK_EQUAL2( L, R ) \ …Run Code Online (Sandbox Code Playgroud) 我们有一个分级手表应用程序.
根控制器是一个菜单项表.该项目列表由服务器控制.检索数据并将其存储在核心数据中.第一次进入应用程序时会填充菜单.
但我希望这张桌子保持最新状态.我的想法是添加代码以willActivate检查是否有更改,并重新加载表.在我的重载逻辑中,我调用了第一次调用的相同函数,它设置menuTable.setNumberOfRows并创建每一行.看看我在日志中添加的内容,它会通过不同的行数和新标签来执行此逻辑.但是手表上的应用程序会显示包含旧数据的表格.
如何使用新信息重新加载此表?
我在 MFC 应用程序中使用MAPISendMail(),但遇到一个问题:Webmail 客户端有时会收到 winmail.dat 附件,而不是“真实”附件。
我研究了很多,发现其他人也遇到这个问题,但没有找到解决方案。
我相信问题可能出在我的MapiFileDesc结构中,其中我将 lpFileType 成员保留为 NULL,以便让邮件程序(在我的例子中为 Outlook 2010)自动确定文件类型。 lpFiletype是一个MapiFileTagExt结构,文档是这样说的: NULL值表示未知的文件类型或由操作系统确定的文件类型。
所以我相信这应该适用于常见类型,例如 JPEG 或 GIF 等。
我读到 winmail.dat 是由 Outlook 发送使用ms-tnef编码编码的邮件引起的,该编码是 Microsoft 专有的。但是,发送电子邮件时,Outlook 将“HTML”显示为突出显示,而不是 RTF。
有谁遇到过这个问题并妥善解决了吗?
通过 SMTP 等发送不是一种选择,因为用户应该在其“已发送邮件”文件夹中拥有邮件的副本。使用 Outlook 对象模型不是一个选项,因为这需要用户安装 Outlook,而不是任何 MAPI 兼容客户端。
我和Spirit Qi有另一个阻碍问题.
我在一个名为error_handler的functor结构中实现了错误处理.这通过引用传递给语法构造函数(参见Qi的MiniC示例).
然后我on_error<fail>在语法的构造函数中定义了:
typedef boost::phoenix::function<error_handler<> > error_handler_function;
on_error<fail>(gr_instruction,
error_handler_function(err_handler)(L"Error: Expecting ", _4, _3));
// more on_error<fail>s...
Run Code Online (Sandbox Code Playgroud)
但是,我error_handler有私人会员.似乎每次都on_error被调用,err_handler对象被复制,因此一旦仿函数离开,局部变量就会被破坏.
我尝试通过引用传递处理程序:
typedef boost::phoenix::function<error_handler<>& > error_handler_function; // <--- Note the ampersand!
on_error<fail>(gr_instruction,
error_handler_function(err_handler)(L"Error: Expecting ", _4, _3));
// more on_error<fail>s...
Run Code Online (Sandbox Code Playgroud)
然而,问题仍然存在:on_error()适用于副本err_handler,而不是单个实例!
我也尝试过boost::phoenix::ref(err_handler)只有编译错误的变体.
当然,必须有一个简单的解决方案来通过引用传递处理程序?
我很感激任何意见.谢谢您的帮助.
我正在为几个类(C++)编写单元测试,并遇到了一个试图为复制构造函数和赋值运算符编写单元测试的问题.一个基本的问题是,程序员将一个成员添加到类中,然后忘记更新c'ctor和/或operator =.
我当然可以按照以下方式编写单元测试:
class MyClass()
{
public:
int a, b;
non_trivial_copyable nasty;
MyClass& operator=(const MyClass& _r)
{
if(this == &r)
return *this;
a = _r.a;
b = _r.b;
nasty = acquire_non_trivial_copyable();
}
};
TEST(My_Class_copy_op)
{
MyClass m1;
m1.a = m1.b = 2;
MyClass m2 = m1;
VERIFY(m2.a == 2);
VERIFY(m2.b == 2);
}
Run Code Online (Sandbox Code Playgroud)
很好.现在程序员添加了一个成员c,但是没有更新运算符和测试用例.
class MyClass()
{
public:
float c;
// ...
}
Run Code Online (Sandbox Code Playgroud)
即使操作员现在已经破损,测试用例仍将快乐地成功.
现在,我们可以做到以下几点:
TEST(My_Class_copy_op)
{
// Aha! Fails when programmer forgets to update test case to …Run Code Online (Sandbox Code Playgroud) 美好的一天,
我已经遇到这个问题,但我特别感兴趣的是"指向的对象成员..."作为上市型运营商在这里维基百科.
我从未在实际代码的上下文中看到过这个,所以这个概念对我来说有些深奥.
我的直觉说他们应该按如下方式使用:
struct A
{
int *p;
};
int main()
{
{
A *a = new A();
a->p = new int(0);
// if this did compile, how would it be different from *a->p=5; ??
a->*p = 5;
}
{
A a;
a.p = new int(0);
// if this did compile, how would it be different from *a.p=5; ??
a.*p = 5;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这不会编译因为p未声明.(见例)
任何人都可以提供一个在C++中使用operator - >*和/或.*的真实示例吗?
c++ ×8
boost-spirit ×3
compiler-bug ×2
unit-testing ×2
apple-watch ×1
attributes ×1
boost ×1
boost-fusion ×1
boost-test ×1
cesium ×1
client ×1
dereference ×1
events ×1
mapisendmail ×1
mfc ×1
native ×1
nested-class ×1
operators ×1
performance ×1
reference ×1
scene ×1
sql ×1
sql-server ×1
synthesize ×1
testing ×1
visual-c++ ×1
watchkit ×1
winmail.dat ×1