gpt4 book ai didi

c++ - 将包含类类型作为模板参数的成员

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:24 25 4
gpt4 key购买 nike

我在编译一些代码时遇到了一些问题,这些代码可以很容易地用以下代码总结:

template <typename _Ty>
class Foo
{
public:
using allocator_type = typename _Ty::allocator_type;
};

template <typename _Ty, typename _Alloc = std::allocator<_Ty>>
class Bar
{
public:
using allocator_type = _Alloc;

Foo<Bar<_Ty, _Alloc>> foo;
};

int main(void)
{
Foo<Bar<int>> x;
}

这在 Visual Studio 中编译失败并出现以下错误:

Error   1   error C2079: 'Bar<int,std::allocator<_Ty>>::foo' uses undefined class 'Foo<Bar<int,std::allocator<_Ty>>>'   c:\users\duncan\desktop\test\test\main.cpp  17  1   Test

如果 Foo 这显然是个问题有一个 _Ty 类型的成员(出于同样的原因 Foo 不能有类型为 Foo 的成员),但由于这里不是这种情况,我有点困惑。更让我失望的是,如果我改变 foo Bar的成员指向一个指针,编译器错误消失。更疯狂,Foo<Bar<_Ty, _Alloc>>可以用作 Bar 的成员函数中的局部变量没有错误。

标准中是否有任何内容阻止此类用法,或者这是 Visual Studio 2013 编译器的错误?我目前无法轻松访问带有 GCC 的编译器来对其进行测试。这种模式似乎值得遵循。

最佳答案

您的代码无法编译,因为在模板特化实例化时 class Bar<int>它要求一个具体的 Bar<int>对象里面的定义 class Bar<int> .这是不允许的,因为当时编译器看到 Foo<Bar<int>> foo; , 它对 Bar<int> 一无所知(即,模板特化的定义 Bar<int> 不完整)。

你可以做的是通过 Bar作为指针。为此,您还需要专精 Foo对于指针,如下例所示:

template <typename _Ty>
class Foo
{
public:
using allocator_type = typename _Ty::allocator_type;
};

template <typename T>
class Foo<T*>
{
public:
using allocator_type = typename T::allocator_type;
};

template <typename _Ty, typename _Alloc = std::allocator<_Ty>>
class Bar
{
public:
using allocator_type = _Alloc;

Foo<Bar*> foo;
};

LIVE DEMO

或强制创建模板特化Bar<int>为了让编译器事先知道:

template <typename _Ty>
class Foo
{
public:
using allocator_type = typename _Ty::allocator_type;
};

template <typename _Ty, typename _Alloc = std::allocator<_Ty>>
class Bar
{
public:
using allocator_type = _Alloc;

Foo<Bar> foo;
};

template class Bar<int>; // force create Bar<int>

LIVE DEMO

还请记住:

  • 后跟大写字母的下划线保留用于 STL。

  • Bar的名字在 template class Bar 的定义中注入(inject).因此,使用内部模板定义 Bar<T, Alloc>Bar是一样的。

关于c++ - 将包含类类型作为模板参数的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25216702/

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