小编Ada*_*iak的帖子

删除重载功能.C++ 11.超载的召唤......含糊不清

有全局功能(仅举例):

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),为什么现在它被禁止?

c++ c++11

8
推荐指数
1
解决办法
624
查看次数

多态性同时继承泛型类

让我们考虑一个抽象基类和一个或多个子类:

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)

这两项任务有什么区别?

c#

2
推荐指数
1
解决办法
110
查看次数

用作模板默认参数时,不调用完全专用的重载方法

我希望能够通过调用重载函数之一(具有完全专业化的模板)来指定默认的非类型模板参数。以下代码表示问题:我期望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)

c++ templates c++17

2
推荐指数
1
解决办法
44
查看次数

将 viewModel 的一部分发布到 post action 方法

我想知道我是否做错了什么,或者无法使用默认模型绑定器仅发布视图模型的一部分。假设我有一个复杂的视图模型,只应发布其中的一小部分。我想实现这样的目标:

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)

c# asp.net-mvc

1
推荐指数
1
解决办法
942
查看次数

标签 统计

c# ×2

c++ ×2

asp.net-mvc ×1

c++11 ×1

c++17 ×1

templates ×1