gpt4 book ai didi

c++ - 涉及 "using"别名的成员函数重载解析中的英特尔 C++ 编译器错误?

转载 作者:IT老高 更新时间:2023-10-28 23:02:43 26 4
gpt4 key购买 nike

#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 描述了在这种情况下如何执行扣除。

If P has a form that contains <T> or <i>, then each argument Pi of the respective template argument list P is compared with the corresponding argument Ai of the corresponding template argument list of A. […]. If Pi is a pack expansion, then the pattern of Pi is compared with each remaining argument in the template argument list of A. Each comparison deduces template arguments for subsequent positions in the template parameter packs expanded by Pi.

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

关于c++ - 涉及 "using"别名的成员函数重载解析中的英特尔 C++ 编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25126987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com