c++14 模板专业化 "used but never defined"
c++14 template specialization "used but never defined"
要为编译时递归定义模板,我必须定义 2 个模板,一个普通模板,另一个用于 "initial" 这种情况:
template<int i>
struct Int {};
constexpr auto iter(Int<0>) -> Int<0>;
template<int i>
constexpr auto iter(Int<i>) -> decltype(auto) {
return iter(Int<i-1>{});
}
int main() {
decltype(iter(Int<10>{})) a;
return 0;
}
但是gcc给出警告:
warning: inline function 'constexpr Int<0> iter(Int<0>)' used but never defined
constexpr auto iter(Int<0>) -> Int<0>;
为什么会有这样的警告?
您已声明函数
constexpr auto iter(Int<0>) -> Int<0>;
但你从未定义它,即没有主体。
也许您想写:
constexpr auto iter(Int<0>) -> Int<0>
{
return Int<0>{};
}
但这对我来说就像一个 XY 问题。当您可以在 constexpr 函数中编写一个简单的循环时,我不明白您为什么要使用这样的递归。
要为编译时递归定义模板,我必须定义 2 个模板,一个普通模板,另一个用于 "initial" 这种情况:
template<int i>
struct Int {};
constexpr auto iter(Int<0>) -> Int<0>;
template<int i>
constexpr auto iter(Int<i>) -> decltype(auto) {
return iter(Int<i-1>{});
}
int main() {
decltype(iter(Int<10>{})) a;
return 0;
}
但是gcc给出警告:
warning: inline function 'constexpr Int<0> iter(Int<0>)' used but never defined
constexpr auto iter(Int<0>) -> Int<0>;
为什么会有这样的警告?
您已声明函数
constexpr auto iter(Int<0>) -> Int<0>;
但你从未定义它,即没有主体。
也许您想写:
constexpr auto iter(Int<0>) -> Int<0>
{
return Int<0>{};
}
但这对我来说就像一个 XY 问题。当您可以在 constexpr 函数中编写一个简单的循环时,我不明白您为什么要使用这样的递归。