Sdílet prostřednictvím


Rozlišení názvů u závislých typů

Chcete-li sdělit kompilátoru, že daný kvalifikovaný název identifikuje typ, použijte direktivu typename.Další informace naleznete v tématu typename.

// template_name_resolution1.cpp
#include <stdio.h>
template <class T> class X
{
public:
   void f(typename T::myType* mt) {}
};

class Yarg
{
public:
   struct myType { };
};

int main()
{
   X<Yarg> x;
   x.f(new Yarg::myType());
   printf("Name resolved by using typename keyword.");
}

Výsledek

Name resolved by using typename keyword.

Vyhledávání nezávislých názvů zkontroluje názvy pro kontext definice šablony—v následujícím příklad by tento kontext nalezl funkci myFunction(char)—a kontext vytvoření její instance.V následujícím příkladu je instance šablony vytvořena ve funkci main. Proto je funkce MyNamespace::myFunction viditelná z místa vytvoření instance a je zvolena jako vhodnější shoda.Pokud by byla funkce MyNamespace::myFunction přejmenována, došlo by k zavolání funkce myFunction(char).

Všechny názvy jsou vyhodnoceny jako nezávislé názvy.Přesto je doporučeno používat plně kvalifikované názvy, může-li dojít k jakýmkoli konfliktům.

//template_name_resolution2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

void myFunction(char)
{
   cout << "Char myFunction" << endl;
}

template <class T> class Class1
{
public:
   Class1(T i)
   {
      // If replaced with myFunction(1), myFunction(char)
      // will be called
      myFunction(i);
}
};

namespace MyNamespace
{
   void myFunction(int)
   {
      cout << "Int MyNamespace::myFunction" << endl;
   }
};

using namespace MyNamespace;

int main()
{
   Class1<int>* c1 = new Class1<int>(100);
}

Výsledek

Int MyNamespace::myFunction

Odstraňování mnohoznačnosti šablon

Aplikace Visual C++ v sadě Visual Studio 2012 vynucuje pro odstraňování mnohoznačnosti s klíčovým slovem "template" pravidla standardu C++98/03/11.V následujícím příkladu by aplikace Visual C++ 2010 přijala standardu odpovídající i neodpovídající řádky. Aplikace Visual C++ v sadě Visual Studio 2012 přijímá pouze odpovídající řádky.

#include <iostream>
#include <ostream>
#include <typeinfo>
using namespace std;

template <typename T> struct Allocator {
    template <typename U> struct Rebind {
        typedef Allocator<U> Other;
    };
};

template <typename X, typename AY> struct Container {
    #if defined(NONCONFORMANT)
        typedef typename AY::Rebind<X>::Other AX; // nonconformant
    #elif defined(CONFORMANT)
        typedef typename AY::template Rebind<X>::Other AX; // conformant
    #else
        #error Define NONCONFORMANT or CONFORMANT.
    #endif
};

int main() {
    cout << typeid(Container<int, Allocator<float>>::AX).name() << endl;
}

Shoda s pravidly odstraňování mnohoznačnosti je požadována, protože jazyk C++ standardně předpokládá, že typ AY::Rebind není šablona, proto kompilátor interpretuje následující znak "<" jako znak "menší než".Pro správnou analýzu znaku "<" jako ostrou závorku musí kompilátor musí vědět, že typ Rebind je šablona.

Viz také

Referenční dokumentace

Řešení šablon a názvů