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++_Templates_Inner Classes_Argument Dependent Lookup_Name Lookup - Fatal编程技术网

C++ 为类模板的特定嵌套类实现非成员泛型函数

C++ 为类模板的特定嵌套类实现非成员泛型函数,c++,templates,inner-classes,argument-dependent-lookup,name-lookup,C++,Templates,Inner Classes,Argument Dependent Lookup,Name Lookup,我有以下课程: template<int P> struct A { struct B { auto abs() const { return 1; } }; }; 它不会工作,因为ADL只在名称空间而不是类作用域中查找UPDATE:ADL在这里不起作用,因为abs是一种实例方法。然而,根据T.C.的回答,如果您将其作为朋友函数,它将正常工作,ADL将找到它 技术2(不起作用):在全局或命名空间范围中使用受约束的函数模板: template<i

我有以下课程:

template<int P>
struct A {
    struct B {
        auto abs() const { return 1; }
    };
};
它不会工作,因为ADL只在名称空间而不是类作用域中查找UPDATE:ADL在这里不起作用,因为
abs
是一种实例方法。然而,根据T.C.的回答,如果您将其作为朋友函数,它将正常工作,ADL将找到它

技术2(不起作用):在全局或命名空间范围中使用受约束的函数模板:

template<int P>
auto abs(typename A<P>::B const &e) { return e.abs(); }
template<typename T>
auto abs(T const &e) { return e.abs(); }
这很有效。然而,它是不受约束的。我想将此函数模板的实例化仅限于
A

(对于
P
之前未知)和其他类模板(对于多项式环和字段扩展)。问题是,如果
P
处于非推断上下文中,我不确定如何使用SFINAE

这将起作用:

namespace impl {
    template <int P>
    struct B {
        auto abs() const { return 1; }
    };

    template <int P>
    auto abs(B<P>& b) {
        return b.abs();
    }
}

template <int P>
struct A {
    using B = impl::B<P>;
    friend B;
};

int main() {
    A<3>::B inner;
    abs(inner);
}
这里的优点是,此公共外观可用于多个类,并且不必是好友。

template
template<int P>
struct A {
    struct B {
        auto abs() const { return 1; }
    };
    friend auto abs(B const &e) { return e.abs(); }
//  ^^^^^^
};
结构A{ 结构B{ auto abs()常量{return 1;} }; friend auto abs(B const&e){return e.abs();} // ^^^^^^ };
然后让ADL发挥它的魔力


(在
B
中定义它也很好。选择由您决定。)

是否有办法保持声明的位置,但在类之外的另一个源文件中提供实现?@M.Alaggan No。这些函数实例化为一系列非模板函数,在类模板定义之外,没有办法拼写它。
namespace impl {
    template <typename T>
    struct facade : public T {};

    template <typename T>
    auto abs(facade<T>& b) { return b.abs();    }
}

template <int P>
struct A {
    struct B_ {
        auto abs() const { return 1; }
    };

    using B = impl::facade<B_ >;
};

int main() {
    A<3>::B inner;
    abs(inner);
}
template<int P>
struct A {
    struct B {
        auto abs() const { return 1; }
    };
    friend auto abs(B const &e) { return e.abs(); }
//  ^^^^^^
};