C++ 访问嵌套类模板的静态成员函数
出于学术目的,我正在重新设计轮子,并尝试编写一个HAL库。现在在设计它时,我遇到了一个我不理解的编译器错误C++ 访问嵌套类模板的静态成员函数,c++,templates,inner-classes,C++,Templates,Inner Classes,出于学术目的,我正在重新设计轮子,并尝试编写一个HAL库。现在在设计它时,我遇到了一个我不理解的编译器错误 template< class DRIVER, class PORT, class PIN > class Instance { Instance(){} public: static void set(const bool val) { DRIVER::GPIOPeripheral<PORT,
template< class DRIVER, class PORT, class PIN >
class Instance
{
Instance(){}
public:
static void set(const bool val)
{
DRIVER::GPIOPeripheral<PORT, PIN>::set(val);
}
// ...
};
模板
类实例
{
实例(){}
公众:
静态无效集(常量布尔值)
{
驱动程序::GPIOPeripheral::集(val);
}
// ...
};
其思想是,驱动程序类定义了“如何”,而GPIO类定义了GPIO接口抽象
驱动程序类如下所示:
class SOC_xyz
{
SOC_xyz(){};
public:
template<class PORT, class PIN>
class GPIOPeripheral
{
static void set(const bool val){ /* ... */ };
}
};
typedef Instance<SOC_t, PORT0_t, PIN0_t> GPIO0_0;
GPIO0_0::set(1);
等级SOC\u xyz
{
SOC_xyz(){};
公众:
模板
类GPIOPeripheral
{
静态空集(const bool val){/*…*/};
}
};
实际代码中的调用如下所示:
class SOC_xyz
{
SOC_xyz(){};
public:
template<class PORT, class PIN>
class GPIOPeripheral
{
static void set(const bool val){ /* ... */ };
}
};
typedef Instance<SOC_t, PORT0_t, PIN0_t> GPIO0_0;
GPIO0_0::set(1);
typedef实例GPIO0\u 0;
GPIO0_0::set(1);
现在编译器给了我一个
错误:应在“,”标记之前使用主表达式
对于调用驱动程序::GPIOPeripheral
的实例::set
函数。从我的理解中,它试图告诉我类模板成员地址部分是错误的,但这超出了我的C++知识。这就是我想做的,甚至是可能的吗
正式声明实例
类模板的驱动程序
类型模板参数的GPIOPeripheral
为模板
依赖名称的模板
消歧器
类似地,在模板定义中,不是
当前实例化的成员不被视为
模板名称,除非使用消歧关键字template
或者,除非已将其建立为模板名称:[……]
另外,请注意,当您使用带有默认访问修饰符
private
的gpioperiperal
声明类模板时,意味着set
成员函数是私有的,不能从外部(词汇)访问类模板本身的作用域是它的朋友。您是否尝试过编写DRIVER::template GPIOPeripheral::set(val)代码>?在GPIOPeripheral
中,set
似乎是私有的。模板
关键字起了作用。非常感谢你。指定要调用的对象/函数的性质是有意义的。我假设编译器会从程序中的实际调用中扣除。至于private
问题:这是我遗漏了无用代码的产物。真正的代码中有公开声明。