【发布时间】:2023-10-24 09:38:01
【问题描述】:
我想使用来自 3rd 方仅标头库的 span 类实现,但使用不同的命名空间。我所做的是创建新的 span.hpp 代理头,其中包含库并将其引入新的命名空间。
现在,当尝试包含该代理标头时,我的整个翻译单元编译会中断,就好像它在语法上不正确(很多很多随机错误)
(编辑:我发现了有问题的错误并将其粘贴在最底部):
namespace new_namespace
{
template <std::size_t Value = ::old_namespace::dynamic_extent>
class span;
template <std::size_t Value>
using span = ::old_namespace::span<Value>;
}
稍微简化一下代码后,它就可以正常工作了:
namespace new_namespace
{
template <std::size_t Value = ::old_namespace::dynamic_extent>
using span = ::old_namespace::span<Value>;
}
我的问题是 - 说我真的非常想将前向声明与默认模板参数和类型别名分开。在这种情况下如何实现这一点?
编辑:
有问题的错误是:
/span.hpp:12:46: error: conflicting declaration of template 'template<long unsigned int Value> using span = old_namespace::span<T>'
using span = ::old_namespace::span<Value>;
^
/span.hpp:9:7: note: previous declaration 'template<long unsigned int Value> class new_namespace::span'
class span;
所以两者都被视为声明?这里到底发生了什么,它们是如何冲突的?
还有一点,old_namespace::span的定义为模板参数Value提供了一个默认值,形式为:
namespace old_namespace
{
template <typename Value = dynamic_extent> // Default parameter in forward declaration
class span;
template <typename Value> // No default parameter here
class span
{
...
}
}
为什么using 别名不从原始类中寻找默认模板参数?如果我尝试省略默认参数,例如简单写:
namespace new_namespace
{
template <std::size_t Value> // no default parameter provided
using span = ::old_namespace::span<Value>;
}
尝试在没有任何模板参数的情况下实例化 span 时出错
提前感谢您的帮助。 :)
干杯
【问题讨论】:
-
声明一个类和使用
using是两件不同的事情,完全不需要转发声明一个using。我不确定你想要达到什么目的。 -
嘿,我基本上想从
using拆分默认模板参数。 AFAIK 可以通过普通的类定义template <typename T = int> class someClass;然后template <typename T> class { .... };来实现这一点 -
但是....为什么?你不能转发声明
using,所以我认为这是不可能的。 -
"中断就好像它在语法上不正确(很多很多随机错误):"我不认为错误是随机的。请将它们包括在问题中
-
嘿,我用我认为是导致整个混乱的错误更新了这个问题。坦率地说,我对此没有任何具体的用例,只是让我有点恼火,因为我认为它是有效的 C++,现在编译器试图证明我错了。我只是想知道真相以便晚上睡得更好。 :D
标签: c++