タグ付けされた質問 「using-declaration」

7
C ++ 11の「typedef」と「using」の違いは何ですか?
C ++ 11ではusing、typedefsのような型エイリアスを書き込むために使用できることを知っています。 typedef int MyInt; 私が理解していることから、これは次と同等です: using MyInt = int; そして、その新しい構文は、 " template typedef" を表現する方法を持つための努力から生まれました。 template< class T > using MyType = AnotherType< T, MyAllocatorType >; しかし、最初の2つの非テンプレートの例では、標準に他の微妙な違いがありますか?たとえば、typedefsは「弱い」方法でエイリアシングを行います。つまり、新しいタイプは作成されず、新しい名前のみが作成されます(これらの名前間の変換は暗黙的です)。 それと同じusingですか、それとも新しいタイプを生成しますか?違いはありますか?

4
2つのusing句が同じ型に解決されるのはなぜgccではあいまいと見なされるのですか
using句を含む2つの基本クラスがあります class MultiCmdQueueCallback { using NetworkPacket = Networking::NetworkPacket; .... } class PlcMsgFactoryImplCallback { using NetworkPacket = Networking::NetworkPacket; .... } 次にクラスを宣言します class PlcNetwork : public RouterCallback, public PlcMsgFactoryImplCallback, public MultiCmdQueueCallback { private: void sendNetworkPacket(const NetworkPacket &pdu); } その後、コンパイラーは、「NetworkPacket」へのエラー参照にあいまいな「sendNetworkPacket(NetworkPacket&...」というフラグを立てます。 これで、両方の「using句」が同じ基本クラスNetworking:NetworkPacketに解決されます 実際、メソッド宣言を次のように置き換えた場合: void sendNetworkPacket(const Networking::NetworkPacket &pdu); それはうまくコンパイルします。 コンパイラーがそれぞれのusing節を両方とも同じ基本型を指しているにもかかわらず、異なる型として扱うのはなぜですか?これは標準によって義務付けられていますか、それともコンパイラのバグがありますか?

1
using宣言でユーザー定義の変換テンプレートを参照することはできますか?
class Bから継承するクラスAでは、次のように、using宣言を使用してのメンバーAをB、さらにはテンプレートに含めることができます。 struct A { template <typename T> void foo(); }; struct B : private A { using A::foo; }; しかし、それは変換テンプレートに対して行うことができますか? struct A { template <typename T> operator T(); }; struct B : private A { using A::operator /* ??? */; }; テンプレートを名前で参照する方法はないようですが、間違っていることが判明するか、説明が必要です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.