c ++ 14模板专业化“已使用但未定义”

问题描述 投票:2回答:1

要定义编译时递归的模板,我要定义2个模板,一个普通模板,另一个用于“初始”情况,如下所示:

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>;

为什么会出现这样的警告?

c++ templates c++14 warnings constexpr
1个回答
7
投票

你已经宣布了这个功能

constexpr auto iter(Int<0>) -> Int<0>;

但是你没有定义它,即没有身体。

也许你想写:

constexpr auto iter(Int<0>) -> Int<0>
{
    return Int<0>{};
}

但这看起来像是一个XY问题。当你可以在constexpr函数中编写一个简单的循环时,我不明白你为什么要这样使用递归。

© www.soinside.com 2019 - 2024. All rights reserved.