涉及“使用”别名的成员函数重载解析中的Intel C ++编译器错误?

old
#include <cstddef>

template<typename T, T... Is>
struct Bar { };

template<size_t... Is>
using Baz = Bar<size_t, Is...>;

struct Foo {
  template<size_t... Is>
  void NoAlias(Bar<size_t, Is...>) { }

  template<size_t... Is>
  void Alias(Baz<Is...>) { }
};

template<typename T, T... Is>
void foo(Bar<T, Is...>) { }

template<size_t... Is>
void bar(Bar<size_t, Is...>) { }

int main() {
  // All these work fine
  foo(Bar<size_t, 4, 2>());
  foo(Baz<4, 2>());
  bar(Bar<size_t, 4, 2>());
  bar(Baz<4, 2>());
  Foo().NoAlias(Bar<size_t, 4, 2>());
  Foo().NoAlias(Baz<4, 2>());

  // But these two give error on ICPC (ICC) 14.0.2:
  //   no instance of function template "Foo::Alias" matches the argument list
  // Note the only difference between NoAlias and Alias is (not) using the alias
  // for the member function parameter
  Foo().Alias(Bar<size_t, 4, 2>());
  Foo().Alias(Baz<4, 2>());

  return 0;
}

ICC 14.0.2给出错误:

$ icc -std=c++11 -Wall -pedantic -pthread -o .scratch{-,.}cpp && ./.scratch-cpp

.scratch.cpp(36): error: no instance of function template "Foo::Alias" matches the argument list
            argument types are: (Bar<size_t, 4UL, 2UL>)
            object type is: Foo
    Foo().Alias(Bar<size_t, 4, 2>());
          ^

.scratch.cpp(37): error: no instance of function template "Foo::Alias" matches the argument list
            argument types are: (Baz<4UL, 2UL>)
            object type is: Foo
    Foo().Alias(Baz<4, 2>());
          ^

但是,它可以同时使用GCC 4.8和Clang 3.4.2进行编译。(在64位Linux上测试。)

熟悉C ++ 11标准的任何人都可以确认这确实是一个错误吗?

另外,是否有一个简单的基于预处理器的解决方法?

哥伦布

您的示例(显然)格式正确。第14.8.2.5/9节介绍了这种情况下的演绎方式。

如果P具有包含<T>的形式<i>,则将各个模板参数列表的每个参数Pi与的模板参数列表P的对应参数Ai进行比较A[…]。如果Pi是压缩扩展,则将Pi的模式与的模板参数列表中的每个剩余参数进行比较A每个比较都推导模板参数包中由Pi扩展的后续位置的模板参数

此外,您的代码正在本机上使用15.0.3版进行编译。因此,升级编译器应该可以解决此问题。我看不到其他简单的解决方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++编译器选择了错误的重载函数

来自分类Dev

C中的分段错误编译器错误

来自分类Dev

C ++中的奇数编译器错误(VC编译器)

来自分类Dev

在某些C ++编译器上使用限制限定符的编译器错误

来自分类Dev

C和DLC编译器的奇怪解析错误

来自分类Dev

C和DLC编译器的奇怪解析错误

来自分类Dev

C ++ 11编译器的构造函数继承生成错误

来自分类Dev

llvmgen.c中的xmos内部编译器错误?

来自分类Dev

简单C链表中的奇怪编译器错误

来自分类Dev

通用类中的编译器错误c1001

来自分类Dev

使用typeof(Expression <Func <,>>)的C#编译器错误

来自分类Dev

编译器中的错误?

来自分类Dev

C中的编译器错误,错误:预期表达式

来自分类Dev

从C ++ 11标准使用constexpr错误,还是我抓到一些编译器错误?

来自分类Dev

从C ++ 11标准使用constexpr错误,还是我抓到一些编译器错误?

来自分类Dev

C编译器错误或程序错误?

来自分类Dev

无法使用Intel编译器强制内联C ++函数

来自分类Dev

仅在g ++编译器中对函数错误的C ++未定义引用

来自分类Dev

C ++使用匿名对象调用函数会导致编译器错误

来自分类Dev

编译器选择错误的重载函数

来自分类Dev

如何克服C ++中的C4430编译器错误?

来自分类Dev

我定义的类的成员出现C ++ Vector数据类型编译器错误问题

来自分类Dev

模板成员函数的编译器错误

来自分类Dev

错误的重载导致编译器错误

来自分类Dev

如果模板解析失败,C ++将强制编译器错误

来自分类Dev

使用Intel C ++编译器的Visual Studio中的OpenMP

来自分类Dev

为什么C ++编译器(VS2013)选择错误的函数?

来自分类Dev

C ++,实现函数`int next(std :: string param)`时出现奇怪的编译器错误

来自分类Dev

为什么在调用C函数时未引发编译器时间错误

Related 相关文章

  1. 1

    C ++编译器选择了错误的重载函数

  2. 2

    C中的分段错误编译器错误

  3. 3

    C ++中的奇数编译器错误(VC编译器)

  4. 4

    在某些C ++编译器上使用限制限定符的编译器错误

  5. 5

    C和DLC编译器的奇怪解析错误

  6. 6

    C和DLC编译器的奇怪解析错误

  7. 7

    C ++ 11编译器的构造函数继承生成错误

  8. 8

    llvmgen.c中的xmos内部编译器错误?

  9. 9

    简单C链表中的奇怪编译器错误

  10. 10

    通用类中的编译器错误c1001

  11. 11

    使用typeof(Expression <Func <,>>)的C#编译器错误

  12. 12

    编译器中的错误?

  13. 13

    C中的编译器错误,错误:预期表达式

  14. 14

    从C ++ 11标准使用constexpr错误,还是我抓到一些编译器错误?

  15. 15

    从C ++ 11标准使用constexpr错误,还是我抓到一些编译器错误?

  16. 16

    C编译器错误或程序错误?

  17. 17

    无法使用Intel编译器强制内联C ++函数

  18. 18

    仅在g ++编译器中对函数错误的C ++未定义引用

  19. 19

    C ++使用匿名对象调用函数会导致编译器错误

  20. 20

    编译器选择错误的重载函数

  21. 21

    如何克服C ++中的C4430编译器错误?

  22. 22

    我定义的类的成员出现C ++ Vector数据类型编译器错误问题

  23. 23

    模板成员函数的编译器错误

  24. 24

    错误的重载导致编译器错误

  25. 25

    如果模板解析失败,C ++将强制编译器错误

  26. 26

    使用Intel C ++编译器的Visual Studio中的OpenMP

  27. 27

    为什么C ++编译器(VS2013)选择错误的函数?

  28. 28

    C ++,实现函数`int next(std :: string param)`时出现奇怪的编译器错误

  29. 29

    为什么在调用C函数时未引发编译器时间错误

热门标签

归档