enable_if class 单独定义的成员函数
enable_if class member function with separate definition
我正在使用 enable_if
class 成员函数迭代变体模板参数。这是一个最小的例子(没有实际的可变参数)
#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() { /* ... */ }
您是否希望能够为您的 class 定义中的两者提供一个声明?
您需要在 class 中添加具有匹配签名的声明
#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<>();
}
我正在使用 enable_if
class 成员函数迭代变体模板参数。这是一个最小的例子(没有实际的可变参数)
#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() { /* ... */ }
您是否希望能够为您的 class 定义中的两者提供一个声明?
您需要在 class 中添加具有匹配签名的声明
#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<>();
}