私はこのような名前の定数をいくつか持っています:
template<int n> class usart {
private:
usart();
public:
enum class tx {};
enum class rx {};
enum class ck {};
};
template<> class usart<1> {
public:
enum class tx { A9 = gpio::A9, C4 = gpio::C4 };
enum class rx { A10 = gpio::A10, C5 = gpio::C5 };
enum class ck { A8 = gpio::A8 };
};
// two more of these
ここで、gpio
は単純な整数列挙型です。
別のファイルでクラスに型安全性を適用したいと思います。
class USART {
public:
template<int N>
USART(typename usart<N>::tx pin_tx, typename usart<N>::rx pin_rx) {
//This signature enforces correct pins with types, doesn't it?
}
};
ただし、これを使用すると
USART us = USART(usart<1>::tx::A9, usart<1>::rx::A10);
エラーが発生します
error: expected ')' before 'pin_tx'
この構文が違法なのはなぜですか?
編集:typename
これで、クラスをインスタンス化しようとすると、次のエラーが発生します。
error: no matching function for call to 'USART::USART(usart<1>::tx, usart<1>::rx)' note: template<int N> USART::USART(typename usart<N>::tx, typename usart<N>::rx) note: template argument deduction/substitution failed: note: couldn't deduce template parameter 'N'