有全局功能(仅举例):
void func( int i )
{
std::cout << i + 100 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我假设用char参数调用这个函数没有任何意义所以我使用delete:
void func(char) = delete;
Run Code Online (Sandbox Code Playgroud)
所以我希望以下呼叫应该是可能的:
func(1);
func(3.1);
func(true);
Run Code Online (Sandbox Code Playgroud)
并且使用char参数调用应该是forbiden:
func('a');
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.打电话时,func('a')我按预期得到:
error: use of deleted function ‘void func(char)’
Run Code Online (Sandbox Code Playgroud)
但在打电话给func(2.3)我的时候:
error: call of overloaded ‘func(double)’ is ambiguous
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误?没有删除带有char参数的函数,double被转换为int并调用了func(int),为什么现在它被禁止?
让我们考虑一个抽象基类和一个或多个子类:
public abstract class BaseInnerClass
{
public int Id { get; set; }
}
public class ConcreteInnerClass : BaseInnerClass
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,我们假设有一个通用抽象类,它具有以上抽象类类型的属性:
public abstract class GeneriAbstractTestClass<T> where T : BaseInnerClass
{
public T InnerClass { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后让我们创建一个继承自上面类的类:
public class ConcreteTestClass : GeneriAbstractTestClass<ConcreteInnerClass>
{
public string ConcreteString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以现在一切都准备问一个问题;)为什么不可能这样做:
//cannot convert initializer type
GeneriAbstractTestClass<BaseInnerClass> genericClass = new ConcreteTestClass();
Run Code Online (Sandbox Code Playgroud)
虽然这是允许的:
//ok
BaseInnerClass baseInner = new ConcreteInnerClass();
Run Code Online (Sandbox Code Playgroud)
这两项任务有什么区别?
我希望能够通过调用重载函数之一(具有完全专业化的模板)来指定默认的非类型模板参数。以下代码表示问题:我期望FieldType2 getDefaultField<FieldType2>()被打印,但Called getDefaultField() !被打印。
#include <iostream>
enum class FieldType1 {
Description1,
Description2,
Description3
};
enum class FieldType2 {
Description1,
Description2,
Description3
};
template<class FiledType>
struct FieldDescription {
constexpr static int startPos{0};
constexpr static FieldType fieldType{};
};
struct ConcreteField2 : public FieldDescription<FieldType2> {};
template<class FieldType>
constexpr FieldType getDefaultField() {
return FieldType{};
};
template<>
constexpr FieldType1 getDefaultField<FieldType1>() {
return FieldType1::Description1;
};
template<>
constexpr FieldType2 getDefaultField<FieldType2>() {
return FieldType2::Description3;
};
template<class FieldDescr,
decltype(FieldDescr::fieldType) fieldType = getDefaultField<decltype(FieldDescr::fieldType)>()>
void process() { …Run Code Online (Sandbox Code Playgroud) 我想知道我是否做错了什么,或者无法使用默认模型绑定器仅发布视图模型的一部分。假设我有一个复杂的视图模型,只应发布其中的一小部分。我想实现这样的目标:
public class ComplexViewModel
{
public object FirstNotPostedData { get; set; }
public object SecondNotPostedData { get; set; }
//......
public object NthNotPostedData { get; set; }
public InnerModelToPost InnerModelToPost { get; set; }
}
public class InnerModelToPost
{
public string FirstProperty { get; set; }
public string SecondProperty { get; set; }
public string ThirdProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
鉴于我想显示模型的一部分并发布另一部分:
@model ComplexViewModel
@* DISPLAYING DATA *@
<form>
@Html.HiddenFor( m => m.InnerModelToPost.FirstProperty )
@Html.HiddenFor( m => m.InnerModelToPost.SecondProperty )
@Html.HiddenFor( …Run Code Online (Sandbox Code Playgroud)