0

タイプの参照を簡単にするために、using句を使用して個々のタイプを現在のスコープに取り込むことができます。

namespace MyCompany
{
    namespace MyProject
    {
        class MyType {};
        void myFunc(MyType const& obj) {}
    }
}

int main()
{
    using MyCompany::MyProject::MyType;
    using MyCompany::MyProject::myFunc;

    MyType  plop;
    myFunc(plop);
}

問題は、クラスがテンプレートクラス(または関数)であるかどうかです。それらを完全にインスタンス化せずに現在のスコープに持ち込むことは可能ですか?

namespace MyCompany
{
    namespace MyProject
    {
        template<typename T>
        class MyType {};

        template<typename T>
        void myFunc(MyType<T> const& obj) {}
    }
}

int main()
{
    // Can I bring the templates into scope?
    // Or do I need to fully instantiate each version in the using clause?
    using MyCompany::MyProject::MyType;  ????
    using MyCompany::MyProject::myFunc;  ????

    MyType  plop;
    myFunc(plop);
}
4

1 に答える 1

1

VC10 と gcc の両方が、using 宣言の後に異なるインスタンス化でコードを正常に実行します。そのため、 using 宣言により、テンプレート全体がスコープに含まれているようです。

また、c++0x 標準 n3290 7.3.3 - 5

A using-declaration shall not name a template-id. [ Example:
struct A {
 template <class T> void f(T);
 template <class T> struct X { };
};
struct B : A {
 using A::f<double>; // ill-formed
 using A::X<int>; // ill-formed
};

これは、特定の template-id で using を使用しないことを示唆しているようです。

于 2012-01-17T16:40:39.010 に答える