「使用」宣言は、テンプレートで使用することはできますか?

StackOverflow https://stackoverflow.com/questions/346697

  •  19-08-2019
  •  | 
  •  

質問

これは、テンプレートベースのクラスで「使用」宣言を使用することは可能ですか?私はそれがない読んだことがある<のhref =「http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/topic/com.ibm.xlcpp8l.doc/language/ref/using_declaration_class_members.htm#using_declaration_class_members」ここをREL =「noreferrer」>しかしための技術的な理由のか、それはC ++標準に反しているということであり、それは、GCCまたは他のコンパイラにも適用されますか?それが不可能な場合は、なぜいけないのでしょうか?

例コード(上記のリンクから)

struct A {
    template<class T> void f(T);
};

struct B : A {
    using A::f<int>;
};
役に立ちましたか?

解決

あなたがリンクされ何に使用してディレクティブです。

:使用して宣言は、テンプレートベースクラス(標準でそれを見上げたが、ちょうどコンパイラでそれをテストしていない)で罰金を使用することができます
template<typename T> struct c1 { 
    void foo() { std::cout << "empty" << std::endl; } 
}; 

template<typename T> struct c2 : c1<T> { 
    using c1<T>::foo; 
    void foo(int) { std::cout << "int" << std::endl; } 
}; 

int main() { 
    c2<void> c;
    c.foo();
    c.foo(10); 
}

コンパイラが正しくあるため、当社のusing宣言のfooの範囲にそれを再宣言するパラメータレスc2機能を見つけ、期待される結果を出力する。

編集:質問を更新しました。ここで更新答えは次のとおりです。

の記事は、テンプレート-ID(テンプレート名と引数)を使用することを許可されていないことについての権利です。しかし、あなたは、テンプレート名を置くことができます:

struct c1 { 
    template<int> void foo() { std::cout << "empty" << std::endl; } 
}; 

struct c2 : c1 { 
    using c1::foo; // using c1::foo<10> is not valid
    void foo(int) { std::cout << "int" << std::endl; } 
}; 

int main() { 
    c2 c;
    c.foo<10>();
    c.foo(10); 
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top