我一直在尝试调用没有参数的模板化朋友函数,这是在类模板中定义的。我找不到确切的情况解决方案并以其他方式解决了我的问题,但在我的实验中我突然发现了一些有趣的代码。它有效,但我不知道为什么。这是这个例子:
#include <iostream>
template<class T> class A
{
public:
void test() const
{
std::cout << "A!" << std::endl;
}
template<class U> friend A fun()
{
return A();
}
};
int main(int argc, char* argv[])
{
A<double> aa; // 1
const auto& a = fun<int>();
a.test();
return 0;
}
正如我所说,它适用于GCC 4.8.1。如果我删除(1),则失败并显示以下内容:
main.cpp: In function 'int main(int, char**)':
main.cpp:20:18: error: 'fun' was not declared in this scope
const auto& a = fun<int>();
^
main.cpp:20:22: error: expected primary-expression before 'int'
const auto& a = fun<int>();
我怀疑这里有UB,但如果有人能澄清那将会非常有趣:
答案 0 :(得分:0)
这似乎是一个GCC错误。在类中定义的friend
函数模板只能通过ADL找到:GCC显然在ADL期间考虑aa
中main
的调用(无理由)并调用{{1}通过这个静态断言证实了A<double>
:
fun
Demo。
Clang完全not compile this code。