我正在使用boost :: variant并且在发布模式下编译时遇到问题.我在VC2010工作,警告级别为4,警告为错误.下面的代码在调试模式下编译很好,但是在发布模式下,我在链接时发出了一堆"无法访问的代码"C4702警告(可能是我在这里收到编译器警告,因为在启用优化时会生成链接时间代码.)
在这种情况下有没有人成功禁用这些警告?如果可能的话,我宁愿将高警告级别和警告保持为错误.
#pragma warning( disable:4702 )
Run Code Online (Sandbox Code Playgroud)
......似乎在这里不起作用.以下是一些示例代码:
#include <boost/variant.hpp>
struct null{};
typedef boost::variant< null, double > variant_t;
class addition_visitor
: public boost::static_visitor< variant_t >
{
public:
template< typename T, typename U >
variant_t operator()( const T&, const U& ) const
{
throw( "Bad types" );
}
variant_t operator()( const double& left, const double& right ) const
{
return variant_t( left * right );
}
};
int main(int /*argc*/, char** /*argv*/)
{
variant_t a( 3.0 ), b( 2.0 ); …Run Code Online (Sandbox Code Playgroud) 我正在开发一个将数据批量加载到SQL Server 2008数据库的应用程序.它将CSV文件写入网络共享,然后调用包含BULK INSERT命令的存储过程.
我正在将应用程序迁移到一个全新的网络.在这个新世界中,批量插入失败并出现此错误:
Msg 4861, Level 16, State 1, Line 1
Cannot bulk load because the file "\\myserver\share\subfolder\filename" could not be opened. Operating system error code 5(failed to retrieve text for this error. Reason: 15105).
Run Code Online (Sandbox Code Playgroud)
我使用Windows身份验证连接到数据库,使用写入文件的同一帐户.该文件及其所在的文件夹授予对我的用户帐户和数据库服务器的域服务帐户的读取和修改权限.该服务帐户显然已经允许约束委托,这在MSDN上提到.仍然没有好处.如果我使用SQL Server帐户连接,则批量插入成功,但我们正在尝试专门用于Windows身份验证.
有没有人知道需要做些什么来使这项工作?SQL Server究竟如何访问网络共享上的数据,在其服务帐户和连接用户的服务帐户之间跳转?我知道我可以在我们当前的基础设施中以类似的情况批量插入,但是随着年龄的增长它是如此的苛刻,以至于很难找到过去已经做过的事情.
我希望在PictureBox中显示图像,从文件加载图像.但是文件会被定期覆盖,所以我无法保持文件锁定状态.我开始这样做:
pictureBox.Image = Image.FromFile( fileName );
但是,这会使文件锁定.然后我尝试通读一个流:
using (System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
pictureBox.Image = Image.FromStream(fs);
}
Run Code Online (Sandbox Code Playgroud)
这不会锁定文件,但会导致稍后抛出异常; MSDN表示流必须在映像的生命周期内保持打开状态.(例外情况包括"可能无法读取已关闭文件"或类似信息.)
如何从文件加载图像,然后没有对文件的进一步引用?
我写了一个文件IO库.一个功能,File::read如下所示:
template <typename T>
void File::read(T * t, unsigned long count) const
Run Code Online (Sandbox Code Playgroud)
它读入countT成*t.
现在,跳到客户端.我分配了一个我想读入的内存缓冲区.我写了这个并且效果很好:
float * buffer = new float [16];
file->read(buffer, 16);
Run Code Online (Sandbox Code Playgroud)
但是,这不是例外的安全.所以我决定将缓冲区包装成一个std::unique_ptr.在这里的某个地方,我犯了一个错误.
std::unique_ptr<float[]> buffer (new float[16]);
file->read(*buffer , 16);
Run Code Online (Sandbox Code Playgroud)
这会在file-> read上产生以下错误:
'operator*'不匹配(操作数类型为'std :: unique_ptr')
我认为通过解除引用unique_ptr我会得到一个指向float[]数组第一个元素的指针.我的错误在哪里,解决了什么?
我有一些描述能力/行为的类,比如飞行或驾驶等.每个类都有一个特定的方法,必须调用它来加载一些数据 - 例如,Flyable有loadFlyData(),Drivable有loadDriveData().对于每个类,方法名称是唯一的.
我有许多派生类可以从一个或多个这些行为类继承.每个派生类都有一个调用的方法loadData(),在此我们应该调用所有父类行为的方法,如loadFlyData(),loadDriveData()等....是否有办法来自动生成使用元编程这种方法吗?由于有许多派生类,如果我可以使用元编程生成这些方法,它可能更易于维护...
行为类:(一个对象类可能有任何这些行为,并且必须调用那些类"加载"方法......
class Flyable {
void loadFlyData() {
}
};
class Drivable{
void loadDriveData() {
}
};
Run Code Online (Sandbox Code Playgroud)
所有对象类都派生自Object:
class Object {
virtual void loadData() {
}
};
Run Code Online (Sandbox Code Playgroud)
派生类:
class FlyingCar : public Object, public Flyable, public Drivable {
virtual void loadData() override {
// How to automatically generate code so that the next two lines are called:
loadFlyData();
loadDriveData();
}
};
Run Code Online (Sandbox Code Playgroud)