Linker nie widzi metod

0

Cześć, mam dość chyba dziwny problem (jak zwykle). Podczas budowania projektu dostaję unresolved externals. Projekt bez problemów budował się w poprzedniej wersji systemu (jest częścią większego systemu) - w tej samej wersji Visuala - 2012 update 5.

Mam klasę bazową:

 
class Base
{
public:
  virtual void addRef() = 0;
  virtual void release() = 0;
}

Potem mam klasę, która po niej dziedziczy:

class Derived: public Base
{
 //ma tu jakieś metody, ale poza addRef i release
}

Następnie mam klasę już konkretną zdefiniowaną tak:

template<class T>
class StaticObject : public T
{
public:
  void addRef() { }
  void release() { }
};

I moją klasę, która dziedziczy po niej:

class MyDerived: public StaticObject<Derived>
{

}

W momencie kompilacji, dostaję błąd linkera odnoszący się do metod addRef i release:
unresolved external symbol "public: virtual void __thiscall StaticObject<class Derived>::addRef(void)" (?addRef@?$StaticObject@VDerived@@@@UAEXXZ)
(analogiczny komunikat przy metodzie release).

Ale jeśli do mojej klasy MyDerived dodam te dwie metody:

 
  void addRef() { }
  void release() { }

(w taki sam sposób jak w klasie StaticObject), to już się nie pulta i mu pasuje. O co tu chodzi?

Liby mam wszystkie.

0

Spróbuj w szablonie zadeklarować te metody jako wirtualne.

0

Próbowałem. Nawet próbowałem jako wirtualne i jeszcze override. To mi wtedy kompilator krzyczał, że metody nie przesłaniają żadnej bazowej metody :|

2

vc++ ma problem z two phased lookup i tutaj bym się spodziewał sedna problemu. Na nowszej wersji działa, więc pozostaje tylko zasugerować abyś zrobił update.

http://rextester.com/LWLZ82564

a clang/gcc nie mają z tym problemów:
http://melpon.org/wandbox/permlink/hO23DwZEsbq26U9I

0

Mam VS2012 update 5, nie ma nowszego, a nie mogę też użyć innej wersji. Dziwne jest to, że analogiczny kod działa w innym projekcie w moim solution. Ale poczytałem o tym trochę i widać, że faktycznie VS ma z tym problem. Wyczytałem gdzieś, żeby włączyć opcję /Za (disable language extensions), ale wtedy cała kompilacja się wali i to na jakiś plikach core'owych. Nie znacie jakiegoś działającego sposobu, żeby to objeść?

0

Póki co, poradziłem sobie w taki sposób, że mam klasę

 
class StaticDerived: public Derived
{
public:
  StaticDerived() {}
  virtual ~StaticDerived() {}
  void addRef() {}
  void release() {}
}

I dziedziczę po niej. Zadziałało. Wiem, że to nie jest poprawne rozwiązanie, więc jeśli ktoś miałby jakiś lepszy pomysł, to z chęcią go zaimplementuję :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1