Преобразование целых чисел в типы с использованием шаблона C ++ не удается в конкретном случае - PullRequest
3 голосов
/ 14 июня 2010

Я пытаюсь скомпилировать следующий код на основе шаблона в VC ++ 2005.

    #include <iostream>
using namespace std;


/*
 * T is a template which maps an integer to a specific type.
 * The mapping happens through partial template specialization.
 * In the following T<1> is mapped to char, T<2> is mapped to long
 * and T<3> is mapped to float using partial template specializations
 */
template <int x>
struct T
{
public:
};

template<>
struct T<1>
{
public:
    typedef char xType;
};


template<>
struct T<2>
{
public:
    typedef long xType;
};

template<>
struct T<3>
{
public:
    typedef float xType;
};

// We can easily access the specific xType for a specific T<N>
typedef T<3>::xType x3Type;

/*!
 * In the following we are attempting to use T<N> inside another
 * template class T2<R>
 */

template<int r>
struct T2
{
    //We can map T<r> to some other type T3
    typedef T<r> T3;
    // The following line fails
    typedef T3::xType xType;
};

int main()
{
    T<1>::xType a1;
    cout << typeid(a1).name() << endl;
    T<2>::xType a2;
    cout << typeid(a2).name() << endl;
    T<3>::xType a3;
    cout << typeid(a3).name() << endl;
    return 0;
}

В коде есть отдельная строка, которая не компилируется:

typedef T3::xType xType;

ЕслиЯ удаляю эту строку, компиляция идет хорошо, и результат:

char
long
float

Если я сохраню эту строку, ошибки компиляции наблюдаются.

main.cpp(53) : warning C4346: 'T<x>::xType' : dependent name is not a type
    prefix with 'typename' to indicate a type
    main.cpp(54) : see reference to class template instantiation 'T2<r>' being compiled
main.cpp(53) : error C2146: syntax error : missing ';' before identifier 'xType'
main.cpp(53) : error C4430: missing type specifier - int assumed. Note: C++ does not    support default-int

Я не могу понять, какчтобы убедиться, что T :: xType может рассматриваться как тип внутри шаблона T2.Любая помощь высоко ценится.

Ответы [ 3 ]

5 голосов
/ 14 июня 2010

Поскольку T3 в вашем классе шаблона зависит от параметра шаблона, компилятор не может точно знать, на что будет ссылаться T3::xType (это может зависеть от фактического типа r в каждом экземпляре T2<r>) .

Чтобы сообщить компилятору, что T3::xType будет типом, вам нужно добавить ключевое слово typename:

typedef typename T3::xType xType;
3 голосов
/ 14 июня 2010

Попробуйте

typedef typename  T3::xType xType;
2 голосов
/ 14 июня 2010

В сообщении об ошибке указывается, что именно вам нужно сделать: добавьте typename перед типом.

typedef typename T3::xType xType;

Причина, по которой вам это нужно, заключается в том, что если есть идентификатор, который можно рассматривать как переменную или тип, компилятор будет обрабатывать его как переменную, что и происходит в этом случае. Чтобы сообщить компилятору, что на самом деле это тип, вы используете ключевое слово typename.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...