gpt4 book ai didi

c++ 无法解释的类 “has not been declared” 由于命名空间导致的错误

转载 作者:行者123 更新时间:2023-12-04 16:50:42 24 4
gpt4 key购买 nike

我有一些模板类,它有两个私有(private)静态成员。
用户定义一个 traits 结构并将其提供给模板类,然后模板类从它派生。

然后在 C++ 文件中,用户定义静态成员,其中一个成员从另一个初始化。
出于某种原因,如果我没有完全指定 arg 的命名空间,我会收到“类尚未声明”错误。这只是当我在嵌套命名空间中时的问题,如果您在单个顶级命名空间中定义类型就没有问题,这让我认为这是一个编译器错误。
修剪下面的例子,用gcc 7.2编译

template<typename Traits>
struct Base
{
static int x;
static int y;
};

namespace foo::bar
{
struct BarTraits
{
};

using Bar = Base<BarTraits>;

template<> int Bar::x = 0;
template<> int Bar::y( Bar::x ); //error
//template<> int Bar::y( foo::bar::Bar::x ); //no error
}

最佳答案

根据 C++ 标准 temp.expl.spec#3

An explicit specialization may be declared in any scope in which the corresponding primary template may be defined.


您的代码违反了此声明,因为 Bar::xBar::y专注于 namespace foo::bar .
由于已知缺陷,GCC 错误地接受了前两个特化 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56119
以下固定代码
template<typename Traits>
struct Base {
static int x;
static int y;
};

struct BarTraits {};
using Bar = Base<BarTraits>;

template<> int Bar::x = 0;
template<> int Bar::y( Bar::x );
被 GCC、Clang、MSVC 接受: https://gcc.godbolt.org/z/MPxjTzbah

关于c++ 无法解释的类 “has not been declared” 由于命名空间导致的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48773022/

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