c++ 隐藏成员函数模板 – 哪个编译器是正确的?

我编写了以下隐藏成员函数模板的代码。

#include <iostream>

struct A 
{
    template<int> void func()
    {
        std::cout<<"Function tamplate of A"<<std::endl;
    }
};

struct B : A 
{
    template<char> void func()
    {
        std::cout<<"Function tamplate of B"<<std::endl;
    }
    using A::func;
};

int main()
{
    B().func<0>();
}

这个程序在Clang编译器中工作。 Live demo Clang

但是,GCC编译器给出了歧义错误

source_file.cpp: In function ‘int main()’:
source_file.cpp:22:17: error: call of overloaded ‘func()’ is ambiguous
     B().func<0>();

那么,哪个编译器是正确的?

最佳答案
关于OP中的示例:正如W.F.所指出的那样,重要的是这些是成员函数模板。您添加了一个using声明,指定([namespace.udecl]/15):

When a using-declaration brings names from a base class into a derived
class scope, member functions and member function templates in the
derived class override and/or hide member functions and member
function templates with the same name, parameter-type-list, cv-qualification, and ref-qualifier (if any) in a base
class (rather than conflicting).

请注意不考虑模板参数。并且Clang通过隐藏int版本来正确处理代码。

另一方面,如果检查under your post建议的示例under your post,GCC就在右边。这根本没有指定以某种方式解决。

一个,有[temp.fct.spec]/3

Trailing template arguments that can be deduced or
obtained from default template-arguments may be omitted from the list
of explicit template-arguments. […] In contexts where deduction is
done and fails, or in contexts where deduction is not done, if a
template argument list is specified and it, along with any default
template arguments, identifies a single function template
specialization, then the template-id is an lvalue for the function
template specialization
.

以粗体显示的文本表示只有在我们提供的模板参数指定单个特化时,您的程序才是格式良好的。表面上看,它没有,因为根据[temp.arg.nontype]/1

A template-argument for a non-type, non-template template-parameter
shall be one of:

  • for a non-type template-parameter of integral or enumeration type, a converted constant expression of the type of the
    template-parameter;

并且0适合两个重载作为转换常量表达式。由于模板参数没有任何ICS排名,这是不明确的。

转载注明原文:c++ 隐藏成员函数模板 – 哪个编译器是正确的? - 代码日志