【发布时间】:2014-06-20 13:08:04
【问题描述】:
代码如下:
struct foo {
template<typename T = void>
friend foo f() { return {}; }
};
int main() {
auto x = f(); // clang++ can't find it, g++ can.
}
clang++ 3.4 给出:
fni2.cpp:8:12: error: use of undeclared identifier 'f'
auto x = f(); // clang++ can't find it, g++ can.
^
1 error generated.
g++ 4.9.0 编译它,但我认为它不应该有。 This 是一个相关问题,但没有明确的答案。第 15.4.2/2,4 节讨论了这一点,但他们都没有说任何建议在类中定义的友元函数模板应该与在类中定义的非模板友元函数具有不同的可见性。
这只是我的学术兴趣,尽管它确实来自可能有实际用例的其他人的问题。
对我来说,它看起来像一个 g++ 错误。
【问题讨论】:
-
貌似g++错了,scope of inline friend functions
-
是的。我也认为 g++ 是错误的。只是想看看其他人在阅读标准中的这些段落时是否与我不同,或者我是否错过了标准中的某些段落。
-
我看到有人用这个来用函数替换方法。他们使用类作为范围。
-
@yngum 这是一个有效的技巧,但您必须在
class定义之外重新声明函数[模板]。 (不过,更好的方式是使用namespace和using声明。) -
@yngum:这样做的动机是什么?为什么不使用命名空间?想到的一种可能性是利用部分专业化。
标签: c++ templates c++11 friend function-templates