Как мне сделать компиляцию этого шаблона класса в VC6 и VC9 - PullRequest
2 голосов
/ 10 июля 2009

У меня есть шаблонный класс, хорошо компилирующийся в VC6. Но это не компилируется в VC9. Для этого я добавил ключевое слово "typename" перед одним типом. После этого он компилируется в vc9, но не в VC6. Как мне сделать это компиляцией с обоими компиляторами.

#include <map> 
#include <vector>

template <class T1, class T2>
class A
{
public:
    std::pair<typename std::vector<std::pair<T1,T2> >::iterator, bool > insert(const std::pair<T1 ,T2> &value_in);
};

template <class T1, class T2>
std::pair< std::vector<std::pair<T1,T2> >::iterator, bool> A<T1,T2>::insert(const std::pair<T1 ,T2>& value_in)
{
    std::pair< std::vector<std::pair<T1,T2> >::iterator, bool> b;
    return b;
}

void main()
{
    A<int, int> a;
    a.insert(std::pair<int, int>(0, 0));
}

Выше код компилируется в VC6. Но не в VC9. Следующий код работает в VC9, а не в VC6.

#include <map> 
#include <vector>

template <class T1, class T2>
class A
{
public:
    std::pair<typename std::vector<std::pair<T1,T2> >::iterator, bool > insert(const std::pair<T1 ,T2> &value_in);
};

template <class T1, class T2>
std::pair<typename std::vector<std::pair<T1,T2> >::iterator, bool> A<T1,T2>::insert(const std::pair<T1 ,T2>& value_in)
{
    std::pair< std::vector<std::pair<T1,T2> >::iterator, bool> b;
    return b;
}

void main()
{
    A<int, int> a;
    a.insert(std::pair<int, int>(0, 0));
}

Ответы [ 3 ]

5 голосов
/ 10 июля 2009

VC6 не очень соответствует стандартам. Возможно, вам просто нужно #IFDEF обойти это.

1 голос
/ 10 июля 2009

Изменения прокомментированы:

#include <map>
#include <vector>

template <class T1, class T2>
class A
{
public:
    std::pair<typename std::vector<std::pair<T1,T2> >::iterator, bool > insert(const std::pair<T1 ,T2> &value_in);
};

template <class T1, class T2>
std::pair< typename std::vector<std::pair<T1,T2> >::iterator, bool> // +typename
A<T1,T2>::insert(const std::pair<T1 ,T2>& value_in)
{
    std::pair< typename std::vector<std::pair<T1,T2> >::iterator, bool> b; // +typename
    return b;
}

int main() // void->int
{
    A<int, int> a;
    a.insert(std::pair<int, int>(0, 0));
}
1 голос
/ 10 июля 2009

У меня нет VC6, но VC2003 тоже жалуется. Поэтому я поставил имя типа перед

std::pair< typename std::vector<std::pair<T1,T2> >::iterator, bool > insert(const std::pair<T1 ,T2> &value_in);

чтобы сделать это

typename std::pair< typename std::vector<std::pair<T1,T2> >::iterator, bool > insert(const std::pair<T1 ,T2> &value_in);

И это сработало, может быть, вы тоже можете попробовать. НТН,

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