Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么MSVC接受在没有模板参数的情况下实例化模板类?_C++_Templates_Visual Studio 2012 - Fatal编程技术网

C++ 为什么MSVC接受在没有模板参数的情况下实例化模板类?

C++ 为什么MSVC接受在没有模板参数的情况下实例化模板类?,c++,templates,visual-studio-2012,C++,Templates,Visual Studio 2012,一切都很好。 现在的问题是,MSVC(2012)所允许的第一个构造究竟是如何实现的 我只看到一个原因,类的唯一成员是operator()函数,因此没有什么真正需要实例化的,甚至没有typedef。因此编译器意识到它可以从后面的操作符()实例中推断出类型。这很好但很奇怪不是吗?这是标准吗?说到这一点,为什么模板参数不在函数上而不是类上?您基本上已经重新制作了std::equal_to,这比C++14中的版本要好,在C++14中,您可以执行std::equal_to()。您真的在问为什么编译器在实现

一切都很好。 现在的问题是,MSVC(2012)所允许的第一个构造究竟是如何实现的


我只看到一个原因,类的唯一成员是operator()函数,因此没有什么真正需要实例化的,甚至没有typedef。因此编译器意识到它可以从后面的操作符()实例中推断出
类型
。这很好但很奇怪不是吗?这是标准吗?

说到这一点,为什么模板参数不在函数上而不是类上?您基本上已经重新制作了
std::equal_to
,这比C++14中的版本要好,在C++14中,您可以执行
std::equal_to()
。您真的在问为什么编译器在实现中有错误吗?我知道很少有程序员从不犯错,我想答案是:我们(大多数人)都是人类。@ghostofstandardspast:当然,我重新制作了std::equal_to,这就是目的。只是有些环境中不包含stl头:'((许可证原因和其他政治原因).然而,不管怎样,我完全被MSVC为什么通过这个版本迷住了,就像它能够从后面的函数实例追溯推断出
类型,这很疯狂。功能强大,但…我不知道是否标准。这是个问题。你也对了,模板可能在函数上。@DavidRodríguez dribeas:我还没有问这个问题。我也怀疑这是一个bug,这是一种基本的,MSVC2012是一个功能强大、符合标准的编译器,运行得非常好。因此,也许这是一种Uberpower,它有点不标准,但很有帮助,微软决定将其包括在内。我想知道!MS2012是一个工具集,而且它已经它的好的和坏的部分。它符合标准吗?在某种程度上,但不是真的。事实上,用模板构建一个正确的程序非常容易,它会在VS中产生错误的结果(根据标准是错误的)。偏离标准不是一个超级大国,而是对其用户的诅咒(供应商锁定)
template< typename Type >
struct TEqualTo
{
    bool operator() (Type const& lhs, Type const& rhs ) const
    {
        return lhs == rhs;
    }
};
// .... later in a function that takes a functor:
Find(a, TEqualTo());
Find(a, TEqualTo<T>());