【发布时间】:2015-01-05 19:47:13
【问题描述】:
当我这样做时编译器不会抱怨 ;-)
// Myfile.h
#include <iostream>
#include <vector>
namespace std
{
template<> class vector<int>
{
public:
vector ()
{
std::cout << "Happy Halloween !!!\n";
}
};
}
有什么方法可以防止类/函数模板的这种不受欢迎的特化?
--编辑--
我只是以 std:: 为例。我正在寻找的是一种防止这种情况发生在任何模板类上的方法。
【问题讨论】:
-
@nav 编译器没有发出警告或错误并不意味着可以做某事。
-
@LuchianGrigore 我同意这种情况。 OP的代码显然是荒谬的。但是一个可以特化一个
std模板,只要它特化依赖于用户定义的类型,特化满足原始模板行为的要求,并且模板不被禁止特化。标准。最后我还是检查了。这不是我第一次误读标准。 -
为什么要阻止它?你显然不能阻止每一种虚假的用例——例如。人们也可以抛弃 const,你不能在那里阻止他们——那么你为什么要特别关注这个特殊情况呢?
-
阻止人们做蠢事往往是以阻止他们做好事为代价的。有不同的方法,但我个人更担心的是记录模板所依赖的内容(以便人们可以正确使用它们),而不是试图想象人们可能会尝试哪些坏事。
-
防止模板特化的唯一有效方法如下:
// Don't specialize this template, or else. -- The boss。
标签: c++ templates c++11 namespaces