繁体   English   中英

单独定义的 enable_if 类成员函数

[英]enable_if class member function with separate definition

我正在使用enable_if类成员函数来迭代变分模板参数。 这是一个最小的例子(没有实际的可变参数)

#include <iostream>

template<int size> class Test {
    public:
        template<int i = 0> typename std::enable_if<i == size, void>::type test() {}

        template<int i = 0> typename std::enable_if<i < size, void>::type test() {
            std::cout << "cycle: " << i << '\n';
            test<i + 1>();
        }
};

int main(int, char**) {
    Test<10> a;
    a.test<>();
}

它工作得很好,但现在我遇到了依赖问题,并决定将声明和定义分开。 我试过这个:

#include <iostream>

template<int size> class Test {
    public:
        template<int i = 0> void test();
};

template<int size>
template<int i> typename std::enable_if<i == size, void>::type Test<size>::test() {}

template<int size>
template<int i> typename std::enable_if<(i < size), void>::type Test<size>::test() {
    std::cout << "cycle: " << i << '\n';
    test<i + 1>();
}

int main(int, char**) {
    Test<10> a;
    a.test<>();
}

但 GCC 表示error: out-of-line definition of 'test' does not match any declaration in 'Test<size>' 我设法通过包含test两种情况的定义来使其工作。 我的问题是:为什么这不起作用? 编译器不应该只找到任何i的声明之一吗? 预先感谢您的任何帮助!

template<int i = 0> 
typename std::enable_if<i == size, void>::type test() { }

template<int i = 0> 
typename std::enable_if<i < size, void>::type test() { /* ... */ }

上面的两个成员函数完全不同,只是碰巧同名test 它们具有不同的签名,必须单独声明。 这类似于写作:

template<int i = 0> 
int test() { }

template<int i = 0> 
float test() { /* ... */ }

您是否希望能够在您的类定义中为这两个声明单独声明?

您需要在类中添加具有匹配签名的声明

#include <iostream>

template<int size> class Test {
    public:
        template<int i = 0> typename std::enable_if<i == size, void>::type test();
    template<int i = 0> typename std::enable_if<i < size, void>::type test();
};

template<int size>
template<int i> typename std::enable_if<i == size, void>::type Test<size>::test() {}

template<int size>
template<int i> typename std::enable_if<(i < size), void>::type Test<size>::test() {
    std::cout << "cycle: " << i << '\n';
    test<i + 1>();
}

int main(int, char**) {
    Test<10> a;
    a.test<>();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM