C++ 枚举类型的类的模板参数推断?

C++ 枚举类型的类的模板参数推断?,c++,templates,enums,template-argument-deduction,C++,Templates,Enums,Template Argument Deduction,编辑:我认为这个问题被错误地标记为重复,特别是对于给定的“重复项”。请参见下文。 今天我尝试(第一次)使用模板函数参数推断 我的目标是实现一个简单的状态系统。下面的代码(希望)显示了重要的部分(我没有测试它,只是为了说明问题): 有趣的是对SetStatus的调用。对于前两行不起作用的代码,编译器抱怨它 couldn't deduce template parameter `Module' 当我明确指定模块时(如第三行所示),程序将编译 我的问题是: 编译器不应该在前两行中推断模块类型吗?!为

编辑:我认为这个问题被错误地标记为重复,特别是对于给定的“重复项”。请参见下文。

今天我尝试(第一次)使用模板函数参数推断

我的目标是实现一个简单的状态系统。下面的代码(希望)显示了重要的部分(我没有测试它,只是为了说明问题):

有趣的是对SetStatus的调用。对于前两行不起作用的代码,编译器抱怨它

couldn't deduce template parameter `Module'
当我明确指定模块时(如第三行所示),程序将编译

我的问题是:

  • 编译器不应该在前两行中推断模块类型吗?!为什么它没有按预期工作

  • 有什么方法我可以简单地称之为SetStatus(OK);没有明确指定模块类型?用C++11解决这个问题会更容易吗

  • 谢谢

    使用的编译器是g++4.9.2

    编辑:我相信“非派生上下文”来自所谓的“副本”,不适用于此处。

    其他案例的经典非派生上下文示例如下:

    template <typename T>
    void g(typename Foo<T>::type);
    
    模板
    void g(typename Foo::type);
    
    我的案例不同:

    template <typename T>
    void SetStatus(enum T::Status localStatus)
    
    模板
    void SetStatus(枚举T::Status localStatus)
    
  • 其他情况下有可能出现歧义,特别是因为Foo::type的类型与T本身无关。这一点,我们的代表已经明确指出

  • 在我的案例中,我看不到任何含糊不清的可能性。如果我错了,请举例说明我的代码如何导致歧义

  • 正如我在评论中已经指出的,我相信通过逻辑(而不是通过正确使用模板参数推断语义,这显然是错误的),编译器可以推断类型


  • 请删除重复标志并回答我的原始问题。

    SetStatus(确定)
    正在传递枚举,参数类型为enum,并且不知道它的包装类,模板参数推断无法确定您想要包装类。谢谢。在这种特定情况下,通过上下文和逻辑,编译器可以在理论上指出枚举参数属于类DerivedA并推断出类型,但实际上这不是模板参数推断的用法,这是正确的吗?
    SetStatus(OK)
    正在传递枚举,参数类型为enum,并且不知道它的包装类,模板参数推断无法确定您想要包装类。谢谢。在这种特定情况下,通过上下文和逻辑,编译器可以在理论上指出枚举参数属于类DerivedA并推断出类型,这是正确的吗?但在实践中,这并不是使用模板参数推断的方式?
    couldn't deduce template parameter `Module'
    
    template <typename T>
    void g(typename Foo<T>::type);
    
    template <typename T>
    void SetStatus(enum T::Status localStatus)