给定以下类模板:
template<typename T>
struct Outer
{
struct Inner;
auto f(Inner) -> void;
};
我们Inner
为以下每种专业分别定义Outer
:
template<>
struct Outer<int>::Inner {};
template<>
struct Outer<double>::Inner {};
然后f
针对以下所有专业定义一次成员函数Outer
:
auto Outer<T>::f(Inner) -> void
{
}
但是Clang(9.0.0)抱怨:
error: variable has incomplete type 'Outer::Inner'
auto Outer<T>::f(Inner) -> void
^
我们还可以通过提供Inner
以下所有其他专长的定义来规避编译器错误Outer
:
template<typename T>
struct Outer<T>::Inner {};
或通过f
为每个专业分别定义:
template<>
auto Outer<int>::f(Inner) -> void
{
}
template<>
auto Outer<double>::f(Inner) -> void
{
}
GCC和MSVC都接受初始代码,这就是问题所在。这是Clang错误,还是这三个中唯一的一致实现?
Inner的专业化是无关紧要的,删除它们不会改变编译结果。
—
n。代词
@n。'代词'。我不确定你是什么意思。这两种添加的定义
—
于
Inner
为所有其他专长,并定义f
为每个单独的专业化解决编译错误。
@n。'代词'。我明白您的意思了,但这仍然是一个奇怪的评论。我的问题的重点是,
—
上贴
Inner
尽管提供了每种专业的定义,但仍被报告为不完整的类型Outer
。Inner
如果删除定义,显然(正确)将是不完整的类型。
“显然心灵意志(正确的),如果你删除它的定义(S)是一个不完整的类型。”不说“不是ckear时所用的专业化是一个完全独立的模板,它根本不会影响主模板。
—
ñ。“代词”米。