Czy to błąd kompilatora VC++ 6.0 ?

0
Witam wszystkich odwiedzających.
Poniżej podaję uproszczony fragment kodu, którego nie mogę zbudować. Używam kompilatora Visual C++ v6.0 z najnowszym SP6. Kompilator nie zwraca błędów natomiast linker podaje następujący :

--------------------Configuration: test - Win32 Debug--------------------
Linking...
test.obj : error LNK2001: unresolved external symbol "public: void __thiscall A<int>::N<int>::Out(void)" (?Out@?$N@H@?$A@H@@QAEXXZ)
Debug/test.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

test.exe - 2 error(s), 0 warning(s)

A oto kod programu :
#include <iostream.h>

template <class T>
class A
{
	public:
		template <class T>
		class N 
		{		   
			private:
				T l;
			public:
				N(T k):l(k) { }

				void Out(); 
		};

	protected:
		int cnt;

	public:
		A(int k):cnt(k)	{}

		int getcnt();
};

template <class T>
void A<T>::N<T>::Out()
{ 
	cout << l; 
}

template <class T>
int A<T>::getcnt()
{
	return cnt;
}

main()
{
	A<int>::N<int> an(5);
	an.Out();
	return 0;
}
Wydaję mi się, że jest to błąd kompilatora lecz chciałbym się upewnić.
Pozdrawiam i z góry dziękuję za pomoc.

</cpp>
0

Masz gdzieś zadeklarowaną funkcję (operator, konstruktor, metode, ...) i jej wywołanie, ale nie masz nigdzie jej ciała.

0

Nie, to nie to. To JEST blad VC++. Bledem jest to, ze przepuscil niepoprawny kod. Nie mozna zagniezdzac template<class T> w template<class T>. Mozna zagniezdzac template<class U> w template<class T> i wtedy wiadomo o co chodzi. A nawet jesli Twoje deklaracje bylyby poprawne, to w cialach wtedy powinno byc:

template <class T>
template <class T>
void A<T>::N<T>::JakasFunkcja() { ...

co jest oczywiscie bez sensu.

Wywal template<class T> przed deklaracja zagniezdzonej klasy. Ewentualnie w wewn. template zmien typ T na np. U i wtedy w cialach funkcji piszesz:

template <class T>
template <class U>
void A<T>::N<U>::JakasFunkcja() { ...

ale NIE:

template <class T>
void A<T>::N<U>::JakasFunkcja() { ...

i tak tez NIE:

template <class T, class U>
void A<T>::N<U>::JakasFunkcja() { ...

Poza tym VC++ 6 jest dosyc cienki jesli chodzi o spelnianie ISO C++ '98, wiec bardziej zaawansowane struktury z wzorcami moga nie dzialac poprawnie...

0

Dzięki, za zainteresowanie. Ciekaw jestem czy jeszczektoś odpisze, bo tak zwlekałem. Niestety rozwiązanie powyższe się nie sprawdza. Lecz na innym forum podano mi odpowiedź : http://www.boost.org/more/microsoft_vcpp.html.

[member-template-outofline] Out-of-line definitions of member templates
Defining member templates outside their enclosing class does not work.
template<class T>
struct A
{
template<class U>
void f();
};

template<class T>
template<class U> // "syntax error"
void A<T>::f() // "T: undeclared identifier"
{
}

Workaround: Define member templates in-line within their enclosing class.

Jeśli zagnieżdżona klasa nie ma nagłówka template a wykorzystuje typy z listy parametrów po słowie template wzorca otaczającego to też jest wzorcem i powyższa reguła także obowiązuje.
Jest to jedna z słabostek kompilatora VC++ SP4

Pozdrawiam

0

witam ma ten sam problem ale mój kod wygląda inaczej .... czy mógłby mi ktoś pomóc ... ?? :(

0

dla dobrego programisty bedzie to 3 min ... proszę o pomoc ... moge wysłac kod na maila :)

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