「使用」宣言は、テンプレートで使用することはできますか?
質問
これは、テンプレートベースのクラスで「使用」宣言を使用することは可能ですか?私はそれがない読んだことがある<の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);
}
所属していません StackOverflow