gpt4 book ai didi

c++11 - g++ 无法在模板类中查找静态函数,这是一个错误还是标准定义的?

转载 作者:行者123 更新时间:2023-12-02 22:22:08 26 4
gpt4 key购买 nike

当我尝试如下所示的一些 C++11 代码时,它传递了我可用的所有支持 C++11 的 clang++,但它无法在 g++-4.8、g++-4.9 和 g++-5.0 中编译。

#include <type_traits>
#include <vector>

template <class C, class First, class Last>
struct HasInsertEnd {
template <class U>
static std::false_type Check(...);

template <class U>
static auto Check(U val)
-> decltype(val.insert(val.end(), std::declval<First>(),
std::declval<Last>()),
std::true_type{});

template <class U>
using Deduce = decltype(Check<U>(std::declval<U>()));

using type = typename Deduce<C>::type;
static constexpr bool value = type::value;
};

int main(int argc, char* argv[]) {
static_assert(!HasInsertEnd<int, int, int>::value, "...");
static_assert(HasInsertEnd<std::vector<int>, const int*, const int*>::value,
"...");
return 0;
}

g++ 将报告如下错误:

‘Check’ was not declared in this scope

如果我将 Deduce 中 Check 的调用更改为 HasInsertEnd::Check,g++ 和 clang++ 都会满意。

我对依赖名称查找知之甚少。问题是,哪种行为是标准的?

最佳答案

这是 GCC 中的一个错误,即使不遵守标准也可以被证明是 GCC 中的一个错误。

template <typename T>
struct f { typedef int type; };

template <typename T>
struct S {
template <typename U>
static f<U> f();

template <class U>
using u = typename decltype(f<U>())::type;

using t = u<T>;
};

S<int>::t main() { }

这在 GCC 4.7.4 和 GCC 5 中以同样的方式被拒绝,并显示“错误:‘f’未在此范围内声明”。那只是无稽之谈。即使静态成员函数应该以某种方式不可见,仍然可以找到一个同名的全局类型。不过,它会变得更好:使用该全局类型,您可以获得:

test.cc: In substitution of ‘template<class T> template<class U> using u = typename decltype (f<U>())::type [with U = T; T = T]’:
test.cc:12:20: required from here
test.cc:10:36: error: ‘f’ was not declared in this scope
using u = typename decltype(f<U>())::type;
^
test.cc:10:36: note: suggested alternative:
test.cc:2:12: note: ‘f’
struct f { typedef int type; };
^
test.cc:15:13: error: ‘t’ in ‘struct S<int>’ does not name a type
S<int>::t main() { }
^

没错,它建议可以通过拼写 f 来纠正 f

我没有发现您的代码有任何问题,如果这不是已知错误,我鼓励您报告它。it's been reported as a bug before .

奇怪的是,正如评论中所述,GCC 4.8.4 和 GCC 4.9.2 确实找到了全局 f。但是,如果全局 f 是一种类型,那么即使提供了模板参数,它们仍然会拒绝该程序,并显示“错误:缺少模板参数”,因此它仍然显然是 GCC 中的一个错误。

关于c++11 - g++ 无法在模板类中查找静态函数,这是一个错误还是标准定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28738915/

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