Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板实例化上的11样式SFINAE和函数可见性_C++_Templates_C++11_Sfinae_Argument Dependent Lookup - Fatal编程技术网

C++ C++;模板实例化上的11样式SFINAE和函数可见性

C++ C++;模板实例化上的11样式SFINAE和函数可见性,c++,templates,c++11,sfinae,argument-dependent-lookup,C++,Templates,C++11,Sfinae,Argument Dependent Lookup,我不确定这是否与sfinae有关,或者只是与任何模板化函数相关。我试图使用sfinae根据相应自由函数的存在来启用/禁用成员函数,而自由函数又根据另一种类型的成员函数的存在来启用/禁用,所有这些都使用以下方法: 这与SFINAE、模板或C++11或ADL无关 无论类型如何,成员都会对具有相同名称的所有非成员进行阴影处理。如果您有一个名为f的成员,则您不能引用任何名为f的非成员,除非您使用限定名(例如::f) 只要使用::f(*这个,t)哇,显然我以前从未使用过来自同名成员的免费函数。你确实是对的

我不确定这是否与sfinae有关,或者只是与任何模板化函数相关。我试图使用sfinae根据相应自由函数的存在来启用/禁用成员函数,而自由函数又根据另一种类型的成员函数的存在来启用/禁用,所有这些都使用以下方法:


这与SFINAE、模板或C++11或ADL无关

无论类型如何,成员都会对具有相同名称的所有非成员进行阴影处理。如果您有一个名为
f
的成员,则您不能引用任何名为
f
的非成员,除非您使用限定名(例如
::f


只要使用
::f(*这个,t)

哇,显然我以前从未使用过来自同名成员的免费函数。你确实是对的。但我不能只在这里使用限定名,我需要adl来处理它。@DavidRodríguez dribeas,这对decltype内的使用没有影响。
@DavidRodríguez dribeas似乎没有必要这样做,不管怎样,它在那里是可见的。@DavidRodríguez dribeas我相信你只能在基类的成员上使用类范围内的using声明,其他什么都不能。@yurikilochek你是对的,我冒昧地删除了所有荒谬的注释:)你不能在
s::f
中也使用using声明吗?@dyp,我可以,但这不会使它在尾部返回类型中可见。尾部返回类型是声明的一部分,因此在它内部的名称查找将找不到它所属的声明。@dyp,你是对的,它按预期工作。(请注意,它有一些缺点:它不太可靠,因为在基类中引入重载或同名成员函数会破坏它。可以使用C++1y的返回类型推断。)
struct S;

template <typename T>
inline auto f(S& s, T const& t)
   -> decltype(t.f(s), void())
{
   t.f(s);
}

struct S
{
    template <typename T>
    auto f(T const& t)
        -> decltype(f(*this, t), void())
    {
        f(*this, t); // <------------------------------------------- HERE
    }
};

struct pass
{
    void f(S&) const
    {
        //...
    }
};

struct fail
{
};

int main()
{
    S s;
    s.f(pass()); // should compile fine
    //s.f(fail()); // should fail to compile due to absence of f from S
    return 0;
}
struct S;

template <typename T>
inline auto f(S& s, T const& t)
    -> decltype(t.f(s), void())
{
    t.f(s);
}

namespace detail
{
    template <typename T>
    inline auto f_dispatcher(S& s, T const& t)
        -> decltype(f(s, t), void())
    {
        f(s, t);
    }
}

struct S
{
    template <typename T>
    auto f(T const& t)
        -> decltype(detail::f_dispatcher(*this, t), void())
    {
        detail::f_dispatcher(*this, t);
    }
};

struct pass
{
    void f(S&) const
    {
        //...
    }
};

struct fail
{
};

int main()
{
    S s;
    s.f(pass()); // compiles fine
    //s.f(fail()); // fails to compile due to absence of f from S
    return 0;
}