给定以下类模板:
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