重载一个带有chrono :: duration的函数

时间:2012-08-04 16:48:37

标签: c++ visual-c++ c++11 visual-studio-2012 chrono

typedef std::chrono::duration<int, std::ratio_multiply<std::ratio<12, 34>, std::ratio<9>>> irrelevant;

void func(irrelevant){} //  comment this out to make it work
void func(std::chrono::seconds){}
void func(std::chrono::minutes){}

int main()
{
    func(std::chrono::seconds(43));
}

上面,包含一个带irrelevant的重载会导致一堆错误,例如:

  

&#39;的std :: ratio_divide&LT; _R1,_R2&GT; ::类型&#39;不是&#39; std :: ratio_divide&lt; _R1,_R2&gt;&#39;

的基类的成员

实际上有什么问题,还是VS2012应该受到责备?我该如何解决它?

1 个答案:

答案 0 :(得分:4)

我无法访问VS2012,但看看是否有效:

typedef std::chrono::duration<int, std::ratio_multiply<std::ratio<12, 34>, std::ratio<9> >::type> irrelevant;

您的代码在C ++ 11模式下为我编译,但在C ++ 03模式下没有编译(clang / libc ++)。我的理论是VS2012还没有实现模板别名,或者如果有,它的<chrono>尚未对模板别名的可用性作出反应。作为后退,ratio_multiply有一个嵌套类型type,应该可以胜任。