【发布时间】:2018-03-29 13:45:04
【问题描述】:
当我尝试打印一个类的实例时,我希望编译器抱怨,
假设T2。在 VS2013+ 中我可以使用:
template <typename T = float>
std::ostream & operator<<(std::ostream & os, const T2 & t2) {
static_assert(std::is_integral<T>::value, "Fail in << for T2");
return os;
}
但是,这在 VS2012 (error C4519: default template arguments are only allowed on a class template) 中不起作用。任何想法如何在 VS2012 中实现这一点?
【问题讨论】:
-
似乎错误没有提到 static_assert 但默认模板参数 typename T = float
-
好吧,但这就是问题所在;没有
template <...>,它完全无法编译,断言失败,因为该函数立即实例化,static_assert失败:/ -
在 MSVC 2017 之前,模板在那些编译器中基本上被破坏了。从 2017 年开始,情况会更好:它只是不合规。
-
我现在确实了解您的问题,我想警告您。即使您可以让 MSVC 接受该代码,它也会在您编写例如
std::cout << "not integral lol"时被完全忽略:请参阅此问题:stackoverflow.com/q/527742/5470596 -
嗯,我有工作超载被调用。所以那部分正在工作。现在我只想让编译失败 if 它被调用。那部分我无法在 VS2012 下工作。 Tbh 我不确定链接的问题与这里的相关性:/