gpt4 book ai didi

c++ - 解耦嵌套类 : "conflicting declaration of template" error when using template aliases

转载 作者:行者123 更新时间:2023-11-28 05:01:01 25 4
gpt4 key购买 nike

遵循 this question 的建议,我使用后期模板实例化来解耦两个类,AB,它们都相互引用:

#include <iostream>
#include <memory>

template <typename T>
class Bbase {
};

template <typename T> class BImpl;

template <typename T>
class AImpl
{
public:
typedef boost::shared_ptr<AImpl> Ptr;
typename BImpl<T>::Ptr foo();
};

template <typename T>
class BImpl
{
public:
typedef boost::shared_ptr<BImpl> Ptr;
typename AImpl<T>::Ptr bar();
};


typedef AImpl<void> A;
typedef BImpl<void> B;

int main () {
A a;
B b;
return 0;
}

以上编译没有错误。

但是,如果我尝试在别处实现 B 并定义一个别名类,我会得到以下编译错误:

#include <iostream>
#include <memory>

template <typename U>
class Bbase {
public:
typedef std::shared_ptr<Bbase> Ptr;
typename U::Ptr bar();
};

template <typename T> class BImpl;

template <typename T>
class AImpl
{
public:
typedef std::shared_ptr<AImpl> Ptr;
typename BImpl<T>::Ptr foo();
};

template <typename T>
using BImpl = Bbase< AImpl<T> >;

typedef AImpl<void> A;
typedef BImpl<void> B;

int main () {
A a;
B b;
return 0;
}

编译器:

$ g++ foo.cpp --std=c++14                                                                                                                                                                        
foo.cpp:22:32: error: conflicting declaration of template ‘template<class T> using BImpl = Bbase<AImpl<T> >’
using BImpl = Bbase< AImpl<T> >;
^
foo.cpp:11:29: note: previous declaration ‘template<class T> class BImpl’
template <typename T> class BImpl;
^
foo.cpp: In instantiation of ‘class AImpl<void>’:
foo.cpp:28:4: required from here
foo.cpp:18:28: error: invalid use of incomplete type ‘class BImpl<void>’
typename BImpl<T>::Ptr foo();
^
foo.cpp:11:29: error: declaration of ‘class BImpl<void>’
template <typename T> class BImpl;
^
foo.cpp: In function ‘int main()’:
foo.cpp:29:4: error: aggregate ‘B b’ has incomplete type and cannot be defined
B b;
^

我理解编译器错误,我正在尝试重新定义模板,但我不理解:

  • 为什么第一个代码片段有效?是第一种情况下的实现和后者的(重新)定义?
  • 我可以将 B 前向声明为模板类,然后再将其声明为别名类吗?

我最想做的是:

using A = std::vector< B::iterator >;
using B = std::vector< A::iterator >;

最佳答案

在第二个例子中,你有这个,它向前声明了一个模板类:

template <typename T> class BImpl;

然后你尝试这样做,它声明了一个模板别名:

template <typename T>
using BImpl = Bbase< AImpl<T> >;

但是别名不是类——您不能使用别名来定义类。编译器告诉你:

foo.cpp:22:32: error: conflicting declaration of template ‘template<class T> using BImpl = Bbase<AImpl<T> >’

Why does the first code snippet work? Is it implementation in the first case and (re)definition in the latter?

第一个代码片段之所以有效,是因为它的格式正确;很简单,没有什么使它不起作用。在第二种情况下,您定义了一个与类同名的别名,这是不允许的。

Can I forward-declare B as a template class and later down declare it as an alias class?

没有。

关于c++ - 解耦嵌套类 : "conflicting declaration of template" error when using template aliases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45971249/

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