我正在尝试使用模板元编程来找到最大公约数,但是编译器报错
I am trying to use template metaprogramming to find the greatest common divisor, but the compiler reports an error
我正在尝试使用模板元编程找到最大公约数,并在此过程中遇到了一些问题。请看代码、错误等信息:
C++代码:
#include <iostream>
namespace meta{
namespace _algorithm{
template<bool size_,long long A_,long long B_>
struct GCD{
static const long long value;
};
template<bool size_,long long A_>
struct GCD<size_,A_,0>{
static const long long value=A_;
};
template<bool size_,long long B_>
struct GCD<size_,0,B_>{
static const long long value=B_;
};
template<long long A_,long long B_>
struct GCD<false,A_,B_>{
static const long long value=GCD<false,B_,A_%B_>::value;
};
template<long long A_,long long B_>
struct GCD<true,A_,B_>{
static const long long value=GCD<true,B_%A_,A_>::value;
};
}
}
using namespace std;
int main(){
cout<<meta::_algorithm::GCD<1346<540,1346,540>::value<<endl;
}
操作系统:Linux(Ubuntu 20.04.1 LTS)
编译器:GCC10.1.0
编译命令:$ g++ main.cpp -std=20
错误信息:
basictype.hpp: In instantiation of ‘const long long int meta::_algorithm::GCD<false, 8, 2>::value’:
basictype.hpp:26:63: recursively required from ‘const long long int meta::_algorithm::GCD<false, 540, 266>::value’
basictype.hpp:26:63: required from ‘const long long int meta::_algorithm::GCD<false, 1346, 540>::value’
basictype.hpp:127:53: required from here
basictype.hpp:26:63: 错误:ambiguous template instantiation for ‘struct meta::_algorithm::GCD<false, 2, 0>’
26 | static const long long value=GCD<false,B_,A_%B_>::value;
| ^~~~~
basictype.hpp:17:16: 附注:备选是: ‘template<bool size_, long long int A_> struct meta::_algorithm::GCD<size_, A_, 0> [with bool size_ = false; long long int A_ = 2]’
17 | struct GCD<size_,A_,0>{
| ^~~~~~~~~~~~~~~
basictype.hpp:25:16: 附注: ‘template<long long int A_, long long int B_> struct meta::_algorithm::GCD<false, A_, B_> [with long long int A_ = 2; long long int B_ = 0]’
25 | struct GCD<false,A_,B_>{
| ^~~~~~~~~~~~~~~~
basictype.hpp:26:63: 错误:嵌套名指定中使用了不完全的类型‘meta::_algorithm::GCD<false, 2, 0>’
26 | static const long long value=GCD<false,B_,A_%B_>::value;
| ^~~~~
有人知道为什么会这样吗?
代码太多,编译器不知道使用哪个模板专业化。但是第一个模板参数可以省略。
让我们假设第一个数字总是更大,并在所有实例化期间保持这个假设:
#include <iostream>
template<long long A, long long B> struct GCD;
template<long long A> struct GCD<A,0> {
static const long long value=A;
};
template<long long A,long long B> struct GCD {
static const long long value=GCD<B,A%B>::value;
};
int main(){
std::cout << GCD<1989,867>::value << std::endl;
}
此外,您可以编写另一个 meta-code,如果第二个值大于第一个,它将在传递给 GCD 之前交换 A 和 B;
template<long long A_,long long B_, bool ABigger=(A_>=B_)>
struct GCD;
template<long long A_>
struct GCD<A_,0, true>{
static const long long value=A_;
};
template<long long B_>
struct GCD<0,B_, false>{
static const long long value=B_;
};
template<long long A_,long long B_>
struct GCD<A_,B_,true>{
static const long long value=GCD<A_%B_, B_>::value;
};
template<long long A_,long long B_>
struct GCD<A_,B_,false>{
static const long long value=GCD<A_,B_%A_>::value;
};
我正在尝试使用模板元编程找到最大公约数,并在此过程中遇到了一些问题。请看代码、错误等信息:
C++代码:
#include <iostream>
namespace meta{
namespace _algorithm{
template<bool size_,long long A_,long long B_>
struct GCD{
static const long long value;
};
template<bool size_,long long A_>
struct GCD<size_,A_,0>{
static const long long value=A_;
};
template<bool size_,long long B_>
struct GCD<size_,0,B_>{
static const long long value=B_;
};
template<long long A_,long long B_>
struct GCD<false,A_,B_>{
static const long long value=GCD<false,B_,A_%B_>::value;
};
template<long long A_,long long B_>
struct GCD<true,A_,B_>{
static const long long value=GCD<true,B_%A_,A_>::value;
};
}
}
using namespace std;
int main(){
cout<<meta::_algorithm::GCD<1346<540,1346,540>::value<<endl;
}
操作系统:Linux(Ubuntu 20.04.1 LTS)
编译器:GCC10.1.0
编译命令:$ g++ main.cpp -std=20
错误信息:
basictype.hpp: In instantiation of ‘const long long int meta::_algorithm::GCD<false, 8, 2>::value’:
basictype.hpp:26:63: recursively required from ‘const long long int meta::_algorithm::GCD<false, 540, 266>::value’
basictype.hpp:26:63: required from ‘const long long int meta::_algorithm::GCD<false, 1346, 540>::value’
basictype.hpp:127:53: required from here
basictype.hpp:26:63: 错误:ambiguous template instantiation for ‘struct meta::_algorithm::GCD<false, 2, 0>’
26 | static const long long value=GCD<false,B_,A_%B_>::value;
| ^~~~~
basictype.hpp:17:16: 附注:备选是: ‘template<bool size_, long long int A_> struct meta::_algorithm::GCD<size_, A_, 0> [with bool size_ = false; long long int A_ = 2]’
17 | struct GCD<size_,A_,0>{
| ^~~~~~~~~~~~~~~
basictype.hpp:25:16: 附注: ‘template<long long int A_, long long int B_> struct meta::_algorithm::GCD<false, A_, B_> [with long long int A_ = 2; long long int B_ = 0]’
25 | struct GCD<false,A_,B_>{
| ^~~~~~~~~~~~~~~~
basictype.hpp:26:63: 错误:嵌套名指定中使用了不完全的类型‘meta::_algorithm::GCD<false, 2, 0>’
26 | static const long long value=GCD<false,B_,A_%B_>::value;
| ^~~~~
有人知道为什么会这样吗?
代码太多,编译器不知道使用哪个模板专业化。但是第一个模板参数可以省略。 让我们假设第一个数字总是更大,并在所有实例化期间保持这个假设:
#include <iostream>
template<long long A, long long B> struct GCD;
template<long long A> struct GCD<A,0> {
static const long long value=A;
};
template<long long A,long long B> struct GCD {
static const long long value=GCD<B,A%B>::value;
};
int main(){
std::cout << GCD<1989,867>::value << std::endl;
}
此外,您可以编写另一个 meta-code,如果第二个值大于第一个,它将在传递给 GCD 之前交换 A 和 B;
template<long long A_,long long B_, bool ABigger=(A_>=B_)>
struct GCD;
template<long long A_>
struct GCD<A_,0, true>{
static const long long value=A_;
};
template<long long B_>
struct GCD<0,B_, false>{
static const long long value=B_;
};
template<long long A_,long long B_>
struct GCD<A_,B_,true>{
static const long long value=GCD<A_%B_, B_>::value;
};
template<long long A_,long long B_>
struct GCD<A_,B_,false>{
static const long long value=GCD<A_,B_%A_>::value;
};