相关疑难解决方法(0)

Clang是否正确拒绝仅通过专门化定义类模板的嵌套类的代码?

给定以下类模板:

template<typename T>
struct Outer
{
    struct Inner;

    auto f(Inner) -> void;
};
Run Code Online (Sandbox Code Playgroud)

我们Inner为以下每种专业分别定义Outer

template<>
struct Outer<int>::Inner {};

template<>
struct Outer<double>::Inner {};
Run Code Online (Sandbox Code Playgroud)

然后f为以下所有专业定义一次成员函数Outer

auto Outer<T>::f(Inner) -> void
{

}
Run Code Online (Sandbox Code Playgroud)

但是Clang(9.0.0)抱怨:

error: variable has incomplete type 'Outer::Inner'

auto Outer<T>::f(Inner) -> void

                      ^
Run Code Online (Sandbox Code Playgroud)

我们还可以通过提供Inner以下所有其他专业的定义来规避编译器错误Outer

template<typename T>
struct Outer<T>::Inner {};
Run Code Online (Sandbox Code Playgroud)

或通过f为每个专业分别定义:

template<>
auto Outer<int>::f(Inner) -> void
{

}

template<>
auto Outer<double>::f(Inner) -> void
{

}
Run Code Online (Sandbox Code Playgroud)

GCC和MSVC都接受初始代码,这就是问题所在。这是Clang错误,还是这三个中唯一的一致实现?

尝试编译器资源管理器

c++ templates template-specialization language-lawyer incomplete-type

16
推荐指数
1
解决办法
213
查看次数