C++ 访问嵌套类模板的静态成员函数

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,

出于学术目的,我正在重新设计轮子,并尝试编写一个HAL库。现在在设计它时,我遇到了一个我不理解的编译器错误

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
问题:这是我遗漏了无用代码的产物。真正的代码中有公开声明。