我有一个ImageView我附加到MenuItem它ActionView(项目出现在ActionBar).此视图的布局来自XML.我这样膨胀它:
ImageView actionView = (ImageView) layoutInflater.inflate(
R.layout.action_view_layout, null);
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常.然而; root在调用中传递null inflate()使Lint对我大喊:
避免将null作为视图根传递(需要解析膨胀布局的根元素上的布局参数)
在我的具体情况下,我似乎可以在没有root的情况下进行管理,但我宁愿让代码尽可能正确.问题是,我不确定哪个View应该用作根.这个答案说它应该是"围绕想要膨胀的视图对象的小部件".但这意味着什么呢?动作栏的那一个?活动?还有别的吗?
更新:阅读答案让我怀疑我正确的做法是:
ActionBar View对应的MenuItemViewGroup这似乎有效.任何人都可以确认或否认这是否应该做什么?
曾几何时,我认为像这样的代码会失败:
const MyClass& obj = MyClass();
obj.DoSomething();
Run Code Online (Sandbox Code Playgroud)
因为MyClass对象将在其完整表达式的末尾被销毁,而将obj作为悬空引用.但是,我(这里)得知这不是真的; 该标准实际上有一个特殊的规定,允许const引用保持临时值,直到所述引用被自己销毁.但是,有人强调,只有const引用具有这种能力.今天我在VS2012中运行了以下代码作为实验.
struct Foo
{
Foo() { std::cout << "ctor" << std::endl; }
~Foo() { std::cout << "dtor" << std::endl; }
};
void f()
{
Foo& f = Foo();
std::cout << "Hello world" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
调用时的输出f()是:
ctor
Hello world
dtor
Run Code Online (Sandbox Code Playgroud)
所以我查看了C++ 11草案标准,并且只发现了这个(§12.2/ 4):
有两种情况,临时表在与完整表达结束时不同的地方被摧毁.第一个背景[不适用].第二个上下文是引用绑定到临时的.绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象在引用的生命周期内持续存在.
const上面显然没有这个词.所以; 有没有为C++ 11改变这种行为,我const开始的事情是错的,还是VS2012有一个bug,我还没有找到标准的相关部分?
例如:
std::weak_ptr<int> wp1(std::make_shared<int>());
std::weak_ptr<int> wp2;
assert(PointsToValidOrExpiredObject(wp1));
assert(!PointsToValidOrExpiredObject(wp2));
Run Code Online (Sandbox Code Playgroud)
这样的功能可能吗?
用例:类的构造函数std::weak_ptr<Foo>作为依赖项.传递过期的对象是可以的(可能在某些工作流程中发生),但传递null意味着程序员忘记了某些事情.我想测试它作为构造函数的参数验证的一部分.
Unity容器将自动解析它可以自己解决的任何类型,而无需手动注册.这在某些方面很好,但我遇到的问题是它使用了TransientLifetimeManager这种类型的分辨率,而我几乎总是想要一个ContainerControlledLifetimeManager.当然,我仍然可以手动将我的类型注册为单身人士,但如果我忘了,而不是在启动时获得未处理的异常,应用程序将成功启动,一切似乎都有效.但是最终会出现一些错误,可能是非常微妙的,难以诊断的错误,因为有一个类型的多个实例意味着单身.
所以我的问题是:有没有办法可以指定不同的默认生命周期管理器或完全禁用默认的自动解析行为,并将容器限制为我自己注册的类型(直接或通过我自己的约定)?
在(尝试)升级VS2012项目以使用boost 1.57之后,我无法再编译 - 出现了大量的错误消息boost/any_iterator.hpp(见下文).作为测试,我创建了一个新项目,其中只包含一个空主函数,#include "boost/any_iterator.hpp"并且得到了相同的错误集.这是它抱怨的代码:
// snippet from boost/any_iterator.hpp
template<
class Value
, class Traversal
, class Reference
, class Difference
, class Buffer
>
class postfix_increment_proxy<
range_detail::any_iterator< // line 131
Value
, Traversal
, Reference
, Difference
, Buffer
>
>
{
// ...
};
Run Code Online (Sandbox Code Playgroud)
同一文件中有另一个类遵循相同的模式并生成相同的错误.range_detail::any_iterator在文件中向前声明更高一点:
namespace range_detail
{
// ...
template<
class Value
, class Traversal
, class Reference
, class Difference
, class Buffer = any_iterator_default_buffer
>
class any_iterator;
// ... …Run Code Online (Sandbox Code Playgroud) (作为回答这个问题的研究结果,我(我想我已经!)确定答案是"不".但是,我不得不在几个不同的地方看看这个,所以我觉得还有这个问题很有价值.但如果社区投票结束,我不会感到沮丧.)
例如:
void f<T>(T val) where T : IComparable
{
val.CompareTo(null);
}
void g()
{
f(4);
}
Run Code Online (Sandbox Code Playgroud)
是4盒装?我知道明确地将值类型转换为它实现触发装箱的接口:
((IComparable)4).CompareTo(null); // The Int32 "4" is boxed
Run Code Online (Sandbox Code Playgroud)
我不知道的是,将值类型作为具有接口约束的泛型参数传递是否等于执行转换 - 语言"其中T是IC Comparable" 类似于建议转换,但只是转变T为IComparable似乎它会打败通用的全部目的!
为了澄清,我想确保在上面的代码中没有发生这些事情:
g调用时f(4),由于对参数类型有约束,因此4被强制转换IComparable为.IComparableff,val.CompareTo(null)不投val从Int32到IComparable为了调用CompareTo.但我想了解一般情况; 不只是ints和IComparables 会发生什么.
现在,如果我将以下代码放入LinqPad:
void Main()
{
((IComparable)4).CompareTo(null);
f(4);
}
void f<T>(T val) where T …Run Code Online (Sandbox Code Playgroud) 可以定义struct(a)没有用户定义的构造函数,(b)不能生成默认构造函数.例如,Foo在下面:
struct Baz
{
Baz(int) {}
};
struct Foo
{
int bar;
Baz baz;
};
Run Code Online (Sandbox Code Playgroud)
您仍然可以创建Foo使用聚合初始化的实例:
Foo foo = { 0, Baz(0) };
Run Code Online (Sandbox Code Playgroud)
我的普通编译器(VS2012)会勉强接受这个,但它会引发2个警告:
警告C4510:'Foo':无法生成默认构造函数.
警告C4610:struct'Foo'永远不能被实例化 - 需要用户定义的构造函数
当然,我刚刚证明警告#2错误 - 你仍然可以使用聚合初始化来实例化它.我尝试过的在线编译器很高兴接受上述内容,因此我猜测VS2012只是过于激进了这个警告.但我想确定 - 这段代码是否正常,还是技术上违反了标准中一些不起眼的部分?
c++ default-constructor language-lawyer aggregate-initialization visual-studio-2012
class Foo<T>
{
public T Bar() { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
我想把Bar的名字传递给Type.GetMethod(string).我可以这样做someType.GetMethod(nameof(Foo<int>.Bar)),但这完全int是武断的; 有什么办法可以省略吗?可悲的是,nameof(Foo<>.Bar)不起作用.
在这个玩具案例中并没有什么大不了的,但是如果有多个类型参数,特别是如果它们where附加了约束,那么拼写它们就可以成为一项任务.
我正在尝试将我的 .net Framework 4.7.2 项目从 System.Reactive 4.4 升级到 5.0。然而,DispatcherScheduler 和将 Dispatcher 转换为 IScheduler 的扩展方法似乎在这两个版本之间都消失了。它们已经过时了吗?移动到不同的包?