2017-06-21 3 views
2

Mein Problem durch das folgende Beispiel veranschaulicht:C++ decltype in Vorlage innere Klasse

#include <vector> 

    template <class T> 
    class TestNest{ 
    public: 
     std::vector<T> m_list; 
     class InsideNest{ 
      const TestNest<T>* m_test; 
      decltype(m_test->m_list.begin()) m_iter; 
     public: 
      InsideNest(const TestNest<T>* source) 
       :m_test(source) 
       ,m_iter(source->m_list.begin()) 
      {} 
     }; 
    }; 

int main(int argc, char *argv[]) 
{ 
    TestNest<int> outside; 
    TestNest<int>::InsideNest inside(&outside); 
} 

der Teil, der nicht kompilieren (zumindest nicht in MSVC2013) ist decltype(m_test->m_list.begin()). Irgendeine Idee, wie ich das Problem umgehen kann?

EDIT: geändert Code Haupt zeigen() und # include

+0

Welchen Compilerfehler bekommen Sie? – NathanOliver

+0

Fehler C2227: links von '-> m_list' muss auf Klasse/struct/union/generischer Typ zeigen – IlBeldus

+0

In VS2015 ist alles in Ordnung. Bitte zeigen Sie die Includes an. – alexeykuzmin0

Antwort

0

Um das Problem zu schließen. Dies ist ein Manko von MSVC2013. Es wird decltype() auflösen, bevor der volle Typ von Mitgliedern "ausgearbeitet" wird, so dass innerhalb von declltyp jeder Zugriff auf Methoden ein Compilerfehler ist. Auch die Verwendung globaler Vorlagenfunktionen (z. B. decltype(std::begin(m_list))) funktioniert nicht. Andere, modernere Compiler arbeiten.

Verwandte Themen