加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – MSVC:显式模板实例化失败,而隐式实例化成功

发布时间:2020-12-16 06:52:20 所属栏目:百科 来源:网络整理
导读:我刚刚遇到MSVC(版本12更新5)的问题: 如果该函数具有通过SFINAE禁用的过载,则显式实例化模板函数失败.但是,调用该函数(从而暗示实例化它)是有效的. 示例代码: #include type_traitstemplate typename Tstd::enable_if_t std::is_integralT::value,// test
我刚刚遇到MSVC(版本12更新5)的问题:

如果该函数具有通过SFINAE禁用的过载,则显式实例化模板函数失败.但是,调用该函数(从而暗示实例化它)是有效的.

示例代码:

#include <type_traits>

template <typename T>
std::enable_if_t< std::is_integral<T>::value,// test is true for T=int
void> foo( T& ) {}

template <typename T>
std::enable_if_t< std::is_pointer<T>::value,// test is false for T=int
void> foo( T& ) {}

void bar( )
{
  int i;
  foo( i );  // calls foo( int& ) (obviously),compiles fine
}
template void foo( int& );  // explicit instantiation,throws compiler error

我得到的编译器错误是错误C2794:’type’:不是’std :: enable_if< false,void>‘的任何直接或间接基类的成员.
GCC相同的代码似乎没问题(除了缺少主要功能):live on Ideone.

这是MSVC的错误吗?有没有一种很好的方法来进行这些显式模板实例化?

解决方法

以下允许实例化该函数,确保它编译并且应该(根据我的理解)也将它放入.obj文件中:

namespace {
  template <typename T>
  void helper( T& A )
  {
    foo( A );
  }

  template void helper( int& );
}

这里的诀窍是,helper(..)既不是重载,也不是任何类型的禁用.对已禁用的重载进行排序会延迟到帮助程序(..)中对foo(..)的“调用”,这是MSVC成功解决的问题.

编辑:正如我们已经看到其他编译器理解我的原始代码,以及更新版本的MSVC(感谢Niall),我认为这是我的MSVC版本的错误,并考虑到部分问题已经充分考虑过.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读