2014-09-25 15 views
8

To jest mój kod: wirtualnego dziedziczenie z kowariantna typ zwracany i argument szablonu klasy błędu LINK w vs2013

#include <vector> 
struct A 
{ 
    typedef std::vector<int> vec; //(1) template type 
    virtual A& test(vec) = 0; 
}; 

struct B : public virtual A //(2) virtual inheritance 
{ 
    virtual B& test(vec) override //(3) covariant return type 
    { 
     return *this; 
    } 
}; 

//std::vector<int> vv, cc(vv); //(4) explicit instantiate copy-ctor 

int main() 
{ 
    B b; 
    b.test({}); 
} 

Visual C++ 2013 dał mi błąd łącza.

error LNK2001: unresolved external symbol "public: __thiscall 
std::vector<int,class std::allocator<int> >::vector<int,class 
std::allocator<int> >(class std::vector<int,class 
std::allocator<int> > const &)" 
([email protected][email protected]@[email protected]@@[email protected]@[email protected][email protected]@Z) 

Próbowałem gcc, i to kompiluje.

Jeśli zrobić jeden z następujących rzeczy, VC skompiluje:

  1. dokonać korekty (1) do typu non-szablonu
  2. usunąć "wirtualny" w wierszu (2)
  3. zmiana rodzaju powrót do & w wierszu (3)
  4. odkomentuj linia (4)

Dlaczego?

+0

Link do testu na żywo: http://rextester.com/XZA77022 – ecatmur

+4

Wygląda jak błąd VC. –

+0

Powinieneś podać dokładną wersję kompilatora, gdy podejrzewasz błąd. VC++ 2013 nie jest wersją dokładną, istnieją 4 aktualizacje (takie jak dodatki Service Pack), a także określone poprawki błędów. Powinieneś uzyskać pełną wersję, otwierając wiersz poleceń narzędzia Visual Studio i wpisując 'cl' –

Odpowiedz

0

Jest to prawdopodobnie błąd VC; Clang i G ++ akceptują ten kod. Co ciekawe, zmiana kodu, aby nie używać listy inicjalizującej w wywołaniu B.test(), jak poniżej , również eliminuje błąd, co prowadzi mnie do przekonania, że ​​istnieje problem z obsługą listy inicjalizatorów VC++, która to powoduje.

#include <vector> 
struct A 
{ 
    typedef std::vector<int> vec; //(1) template type 
    virtual A& test(vec) = 0; 
}; 

struct B : public virtual A //(2) virtual inheritance 
{ 
    virtual B& test(vec) override //(3) covariant return type 
    { 
     return *this; 
    } 
}; 

//std::vector<int> vv, cc(vv); //(4) explicit instantiate copy-ctor 

int main() 
{ 
    A::vec v; 
    B b; 
    //b.test({}); 
    b.test(v); 
} 
Powiązane problemy