调用朋友模板函数,没有在类模板中定义的参数

时间:2014-11-26 22:25:16

标签: c++ templates language-lawyer friend argument-dependent-lookup

我一直在尝试调用没有参数的模板化朋友函数,这是在类模板中定义的。我找不到确切的情况解决方案并以其他方式解决了我的问题,但在我的实验中我突然发现了一些有趣的代码。它有效,但我不知道为什么。这是这个例子:

#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,但如果有人能澄清那将会非常有趣:

  1. 为什么它完全有效,而我没有告诉fun()它应该使用哪种A的专业化?
  2. 如果它不是UB,T是什么类型的?我尝试了type_info,发现它既不是int也不是double。 typeid()。name()在返回&#39; FdvE&#39;时没有帮助。对我来说。

1 个答案:

答案 0 :(得分:0)

这似乎是一个GCC错误。在类中定义的friend函数模板只能通过ADL找到:GCC显然在ADL期间考虑aamain的调用(无理由)并调用{{1}通过这个静态断言证实了A<double>

fun

Demo
Clang完全not compile this code