一位同事告诉我这段代码:
std::ifstream stream(filename.c_str());
if (!stream)
{
throw std::runtime_error("..");
}
Run Code Online (Sandbox Code Playgroud)
会错的.ifstream如果开放成功,他说评估为0.我的代码有效,但我想查找文档,但没有看到它说如何检查开放是否成功.你能指点我吗?
我正在使用CMake在Windows(Visual Studio)以及Linux机器(gcc)上构建我的项目.我想将一些代码标记为"仅调试",就像使用
#ifdef DEBUG
//some logging here
#endif
Run Code Online (Sandbox Code Playgroud)
问题是:CMake"Debug"构建类型中的所有平台上都有哪些编译器定义?DEBUG似乎不存在.(我希望只有在构建类型为Debug时才能进行日志记录或其他任何操作.)
我正在研究我的代码的const正确性,只是想知道为什么这个代码编译:
class X
{
int x;
int& y;
public:
X(int& _y):y(_y)
{
}
void f(int& newY) const
{
//x = 3; would not work, that's fine
y = newY; //does compile. Why?
}
};
int main(int argc, char **argv)
{
int i1=0, i2=0;
X myX(i1);
myX.f(i2);
...
}
Run Code Online (Sandbox Code Playgroud)
据我所知,f()正在改变对象myX,尽管它说是const.当我分配给y时,如何确保我的编译器抱怨?(Visual C++ 2008)
非常感谢!
我无法将Google Test的ASSERT_THROW()宏与多个模板参数结合使用.考虑一下我想确保Matrix<5,1>抛出的构造:
ASSERT_THROW(Matrix<5,1>(), std::runtime_error);
Run Code Online (Sandbox Code Playgroud)
(这个例子没有多大意义,当然这不应该抛出,但它是在简化我所拥有的之后留下的.)
我从MS VC++ 2008获得此输出:
warning C4002: too many actual parameters for macro 'ASSERT_THROW'
error C2143: syntax error : missing ',' before ';'
Run Code Online (Sandbox Code Playgroud)
虽然没有问题:
ASSERT_THROW(Matrix<1>(), std::runtime_error);
Run Code Online (Sandbox Code Playgroud)
我怎样才能克服这个问题?
谢谢!
我想在两个不同的目标中包含一个.cpp文件(在运行CMake后成为两个VS项目).我想为这些项目设置不同的COMPILE_FLAGS.
但是,当我这样做的时候
SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags1")
ADD_EXECUTABLE(project1 myfile.cpp)
SET_TARGET_PROPERTIES(myfile.cpp PROPERTIES COMPILE_FLAGS "flags2")
ADD_EXECUTABLE(project2 myfile.cpp)
Run Code Online (Sandbox Code Playgroud)
"flags2"适用于这两个项目,因此看起来第3行中的属性被覆盖而第2行没有考虑.这是真的还是我错过了什么?有办法解决这个问题吗?
谢谢!
我的应用程序的用户报告说,当我的应用程序正在侦听指纹身份验证(我已经呼叫fingerprintManager.authenticate)并且屏幕已关闭(通过按设备电源开关按钮)时,无法使用指纹解锁设备.
我还可以看到在屏幕关闭时调用onAuthenticationError回调方法,这在我离开活动时不会发生,因为我调用CancellationSignal.cancel()了我的onPause方法.我已经检查过了onPause.
在指纹对话框示例中可以观察到相同的行为(https://github.com/xamarin/monodroid-samples/tree/master/android-m/FingerprintDialog,移植自https://github.com/googlesamples/android- FingerprintDialog)
我该怎么做才能解决这个问题?
编辑:我还尝试注册一个android.intent.action.SCREEN_OFF的广播接收器,它在onPause之后得到通知,因此调用cancel()该接收器不会改变任何东西也就不足为奇了.
我有一些C++数据类型,我想改善我的团队的调试经验.因此,我想在autoexp.dat文件中创建自定义可视化工具.[AutoExpand]部分似乎不够,所以我开始查看[Visualizer].我发现这个网站有一些解释,但是有没有全面的参考/手册/教程?例如,我没有得到$ c和$ e之间的区别.我已经成功地展示了一些基本信息,但我觉得还有更多要知道......
你知道什么好资源吗?
谢谢!
我的应用程序使用Android的密钥库在使用指纹进行身份验证后加密某些数据.这似乎适用于大多数设备,但我收到了OnePlus2用户的错误报告,但有例外
android.security.KeyStoreException: Signature/MAC verification failed
at android.security.KeyStore.getKeyStoreException(KeyStore.java:632)
at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.update(KeyStoreCryptoOperationChunkedStreamer.java:132)
at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:217)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:473)
at javax.crypto.Cipher.doFinal(Cipher.java:1502)
Run Code Online (Sandbox Code Playgroud)
我的代码基本上是这样的(用Mono for Android编写):
Cipher _cipher = Cipher.GetInstance(KeyProperties.KeyAlgorithmAes + "/"
+ KeyProperties.BlockModeCbc + "/"
+ KeyProperties.EncryptionPaddingPkcs7);
KeyStore _keystore = KeyStore.GetInstance("AndroidKeyStore");
FingerprintManager _fingerprintManager = (FingerprintManager) Context.GetSystemService(Context.FingerprintService);
_keystore.Load(null);
var key = _keystore.GetKey(_keyId, null);
_cipher.Init(CipherMode.EncryptMode, key);
_cryptoObject = new FingerprintManager.CryptoObject(_cipher);
_fingerprintManager.Authenticate(_cryptoObject, _cancellationSignal, 0 /* flags */, this, null);
//OnAuthSucceeded:
var mySecret = _cipher.DoFinal(System.Text.Encoding.UTF8.GetBytes(textToEncrypt));
Run Code Online (Sandbox Code Playgroud)
代码有什么问题吗?这个例外是什么意思?
我需要(在)Windows和Linux上(de)序列化数据(并在其间传输文件).我想使用Boost序列化库的可移植二进制存档,可以在示例中找到,例如参见http://boost-doc-zh.googlecode.com/svn-history/r380/trunk/libs/serialization/example /
这适用于Windows(VS 2008),但无法在GCC 4.3.2下编译,但有以下错误.
有人可以提出解决方案吗?
非常感谢!
/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp: In member function 'void portable_binary_iarchive::init(unsigned int)':
/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp:78: error: 'uint_least32_t boost::archive::version_type::t' is private
/home/myfolder/src/portable_binary_iarchive.cpp:92: error: within this context
/home/myfolder/src/portable_binary_iarchive.hpp: In member function 'void portable_binary_iarchive::load(T&) [with T = boost::archive::class_id_type]':
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:107: instantiated from 'static void boost::archive::load_access::load_primitive(Archive&, T&) [with Archive = portable_binary_iarchive, T = boost::archive::class_id_type]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:356: instantiated from 'static void boost::archive::detail::load_non_pointer_type<Archive>::load_primitive::invoke(Archive&, T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:433: instantiated from 'static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:586: instantiated …Run Code Online (Sandbox Code Playgroud) 假设你有这样的代码:
struct Manager
{
template <class T>
void doSomething(T const& t)
{
Worker<T> worker;
worker.work(t);
}
};
Run Code Online (Sandbox Code Playgroud)
"管理器"对象创建一次,并使用一些不同类型"T"调用,但每种类型T被多次调用.这可能是简化形式,如
Manager manager;
const int N = 1000;
for (int i=0;i<N;i++)
{
manager.doSomething<int>(3);
manager.doSomething<char>('x');
manager.doSomething<float>(3.14);
}
Run Code Online (Sandbox Code Playgroud)
现在分析表明,构建一个Worker<T>是一个耗时的操作,应该避免构造它N次(内doSomething<T>).出于线程安全的原因,可以使用一个Worker<int>,一个Worker<char>和Worker<float>每个"管理器",但不是一个Worker<int>适用于所有管理器.所以通常我会把"worker"变成一个成员变量.但是我怎么能在上面的代码中这样做呢?(我事先不知道会使用哪个"T").
我找到了一个使用std :: map的解决方案,但它不是完全类型安全的,当然也不是很优雅.在Worker<T>没有虚拟方法的情况下,你能建议一种类型安全的方式而不是每个"T" 构建一次吗?
(请注意,Worker不是从任何模板参数的免费基类派生的).
谢谢你的解决方案!
c++ ×7
android ×2
cmake ×2
boost ×1
c ×1
const ×1
encryption ×1
fingerprint ×1
googletest ×1
iostream ×1
macros ×1
performance ×1
reference ×1