我有一些模板类,其中有两个私有静态成员。用户定义了一个特征结构并将其提供给模板类,然后从该结构派生。
然后在C++文件中,用户定义静态成员,其中一个成员从另一个成员初始化。 如果我不完全指定名称空间以用于参数,则会出现“未声明的类”错误,但我不知道原因。只有当我位于嵌套的命名空间中时才会出现此问题,在单个顶级名称空间中定义类型则没有问题,这让我认为这是编译器错误。 下面是简化的示例,使用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
}
x
处就会报错,提示 *无法在此定义或重新声明 'x',因为命名空间 'bar' 不包含命名空间 'Basefoo::bar::BarTraits'*。 - Bo Perssontemplate<> int Bar::y( Bar::x );
并没有定义一个带有初始化器的静态数据成员。在此处您不能使用圆括号作为初始化器。 - StoryTeller - Unslander Monica