gpt4 book ai didi

C++嵌套模板问题

转载 作者:可可西里 更新时间:2023-11-01 17:57:21 25 4
gpt4 key购买 nike

GCC 7.3.1 编译以下代码,而 clang 8.0.0 不编译。我想知道此语法是否有效(在这种情况下,我会将其报告为可能的 clang 错误)。

感谢您的帮助。

template<typename FOO>
struct Foo
{
using Value = int;

template<Value VALUE>
struct Bar;
};

template<typename FOO>
template<typename Foo<FOO>::Value VALUE>
struct Foo<FOO>::Bar { static void test(); };

template<typename FOO>
template<typename Foo<FOO>::Value VALUE>
void Foo<FOO>::Bar<VALUE>::test() {}

int main() { return 0; }

clang 的错误信息如下:

error: nested name specifier 'Foo<FOO>::Bar<VALUE>::' for declaration does not refer into a class, class template or class template partial specialization
void Foo<FOO>::Bar<VALUE>::test() {}
~~~~~~~~~~~~~~~~~~~~~~^
1 error generated.

编辑:clang 可能的错误报告 here .

最佳答案

来自 [temp.mem.class/1] , 我们有

A member class of a class template may be defined outside the class template definition in which it is declared.

此外,在非模板上下文中,[class.nest/2]告诉我们:

Member functions and static data members of a nested class can be defined in a namespace scope enclosing the definition of their class.

因此,让我们构建一个更简单的示例,并验证嵌套类型成员函数的定义是否允许与嵌套的非模板的定义分开> 自己打字。类似于您的代码段中的类型:

template <class FOO>
struct Foo {
// Simpler, Bar is not a template
struct Bar;
};

// Definition of Bar outside of Foo as before
template <class FOO>
struct Foo<FOO>::Bar {
static void test();
};

现在是关键部分,在 Bar 本身之外定义 Bar::test():

template <class FOO>
void Foo<FOO>::Bar::test() { }

这可以很好地与 gcc-8clang(trunk 以及更旧的稳定版本)一起编译。

我可能在这里误解了什么,但我的结论是在 Foo 之外定义 Foo::Bar::test() 的语法>Bar 确实不错,clang 应该像 gcc 那样编译它。

关于C++嵌套模板问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55334378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com