C 11:此不完整类型错误的解决方法

C++11: Workaround Use Of This Incomplete Type Error?

本文关键字:错误 类型 解决 方法      更新时间:2023-10-16
#include <iostream>
#include <array>
using namespace std;
constexpr int N = 10;
constexpr int f(int x) { return x*2; }
typedef array<int, N> A;
template<int... i> struct F { constexpr A f() { return A{{ f(i)... }}; } };
template<class X, class Y> struct C;
template<int... i, int... j>
struct C<F<i...>, F<j...>> : F<i..., (sizeof...(i)+j)...> {};
template<int n> struct S : C<S<n/2>, S<n-n/2>> {}; // <--- HERE
template<> struct S<1> : F<0> {};
constexpr auto X = S<N>::f();
int main()
{
        cout << X[3] << endl;
}

我得到了:

test.cpp:15:24: error: invalid use of incomplete type ‘struct C<S<5>, S<5> >’

我怀疑这是因为S的定义将自己用作基类。(正确?)

解决此问题的最佳方法是什么?

更新:

这是固定版本:

#include <iostream>
#include <array>
using namespace std;
constexpr int N = 10;
constexpr int f(int x) { return x*2; }
typedef array<int, N> A;
template<int... i> struct F { static constexpr A f() { return A{{ ::f(i)... }}; } };
template<class A, class B> struct C {};
template<int... i, int... j> struct C<F<i...>, F<j...>> : F<i..., (sizeof...(i)+j)...>
{
        using T = F<i..., (sizeof...(i)+j)...>;
};
template<int n> struct S : C<typename S<n/2>::T, typename S<n-n/2>::T> {};
template<> struct S<1> : F<0> { using T = F<0>; };
constexpr auto X = S<N>::f();
int main()
{
        cout << X[3] << endl;
}

定义 C而不仅仅是声明。

template<class X, class Y> struct C {};

在您使用的地方,部分专业化不匹配,并且主模板是实例化的,只是声明。

您可能想知道为什么不考虑这种专业:专业不考虑转换,而只是静态类型。这就是为什么他们如此勇敢地与继承不相容。

您可以委派S::f而不是使用继承?

template<int n> struct S {
    constexpr A f() { return C<S<n/2>, S<n-n/2>>::f(); }
};