gpt4 book ai didi

c++ - 为什么 'outer inline' 模板不编译?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:10 24 4
gpt4 key购买 nike

好的,这是一个代码:

#include <sstream>

struct A {
class Type {};
template < typename Type >
Type as( void ) {
std::istringstream test;

Type temp;
test >> temp;

return temp;
}
};

它编译正常,一点问题都没有。

现在,这是几乎相同的代码:

#include <sstream>

struct A {
class Type {};
template < typename Type >
inline Type as(void);
};

template < typename Type >
Type A::as( void ) {
std::istringstream test;

Type temp;
test >> temp;

return temp;
}

砰,它不再编译了。错误:

t.cc:14:10: error: invalid operands to binary expression ('std::istringstream' (aka 'basic_istringstream<char>') and 'A::Type')
test >> temp;
~~~~ ^ ~~~~

我已经用 clang 和 gcc 重现了这种行为。

为什么编译器在第二种情况下使用了错误的类型? (明确一点:我知道枚举存在冲突,但根据我的理解,如果这是真正的问题,第一个代码也应该无法编译)

最佳答案

A::as() 中的作用域使用 A::Type 作为 temp 的类型限定符。查看此内容的最简单方法是将嵌套类名称更改为 Type 以外的名称。

更好的问题是为什么它首先发生。它与声明点、名称查找和名称隐藏有关,所有这些都包含在标准的第 3.3、3.4 和 14.6.4 节中。这是一组非常丰富的部分,如果/当我有时间缩小它们的范围时,我将发布与此问题相关的具体条款。到目前为止,我依赖 3.3.9-10 和 3.4

无论如何,更改类名允许模板参数在结构声明的范围之外解析,后者是为什么它首先发生的关键(所以我导致无论如何,按标准相信)。

struct A
{
class TypeX {};
template < typename Type >
Type as(void);
};

template < typename Type >
inline Type A::as( void )
{
std::istringstream test;
Type temp;
test >> temp;
return temp;
}

非常有信心,如果我在标准中有与此问题相关的错误部分,那么 StackOverflow 的大量用户将通过此答案发送热棒。

关于c++ - 为什么 'outer inline' 模板不编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13428236/

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