【问题标题】:Substitute the forward declared struct with lately defined struct用最近定义的结构替换前向声明的结构
【发布时间】:2019-12-26 13:49:15
【问题描述】:

我正在尝试用最近定义的结构A替换前向声明的结构B。这是一个代码示例:

#include <iostream>
using namespace std;

namespace n1 {
struct B;

namespace n3 {
    void func(B& b) {
        cout << "b\n";
    }
}

}

namespace n2 {
struct A{};
}

namespace n1 {
using B = n2::A;
}

int main() {
    n1::B b;
    n1::n3::func(b);
    return 0;
}

并得到以下错误:

conflicting declaration ‘using B = struct n2::A’
 using B = n2::A;
                ^
prog.cpp:5:8: note: previous declaration as ‘struct n1::B’
 struct B;

如果它甚至是合法的,这个技巧是否可能以某种方式实现?我错过了什么吗?

【问题讨论】:

  • 用例是什么?您尝试通过这样的方式解决的原始问题是什么(顺便说一句,这是无效的)?
  • 我有一个接受结构 B 的函数。一个 实现 在公共命名空间中定义为 A。我希望能够通过使用using 将别名B 作为商业逻辑结构来替换所谓的implementation。但是上面的问题还是一样的。
  • 也许您应该将n1::n2::func 改为模板函数?如果n1::Bn2::A 的接口足够等价,那么模板应该可以正常工作。
  • n1::B 和 n2::A 被认为是 相同 目标,但在不同的命名空间中强调它们都使用的逻辑字段。我认为你没有解决问题。

标签: c++ namespaces typedef forward-declaration


【解决方案1】:

您的 using 指令正在创建名称为 n1::Bn2::A 的别名,该别名已被命名空间 n1 内的结构声明 struct B; 采用(它不是结构 B 的另一个声明,它是名称别名) .您可能尝试实现的是提供您的 n1::B 结构的定义,可以这样完成:

namespace n1
{
struct B {
    // definition here, you might use your struct A if you need
};
}

namespace docs

【讨论】:

  • 目标是使用一个已经定义好的A,而不是声明一个新的结构体;
  • @ilev4ik,是的,注意到了;关键是您不能使用已声明的名称(在您的情况下为结构 B)创建实现的同义词/别名;如果您需要在struct B 中使用struct A 逻辑,只需显式调用B 中的A 逻辑即可;如果您的问题比这更复杂,请提供更多详细信息。
  • 我明白了。就是这样。名称B 已保留。
【解决方案2】:

您不能转发声明的别名。

如果合适的话,一种解决方法是使用继承而不是别名:

namespace n1 {
struct B;

namespace n3 {
    void func(B& b) {
        cout << "b\n";
    }
}

}

namespace n2 {
struct A{};
}

namespace n1 {
struct B : n2::A{};
}

Demo

但是

n2::A a;
n1::n3::func(a); // Fail, a is not n1::B

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多