DlaczegoJak zaprzyjaźnić się z konstruktorem klasy szablonowej?
class A;
template<typename T> class B
{
private:
A* a;
public:
B();
};
class A : public B<int>
{
private:
friend B<int>::B<int>();
int x;
};
template<typename T>
B<T>::B()
{
a = new A;
a->x = 5;
}
int main() { return 0; }
wynik w
../src/main.cpp:15: error: invalid use of constructor as a template
../src/main.cpp:15: note: use ‘B::B’ instead of ‘B::class B’ to name the constructor in a qualified name
jeszcze do zmieniających friend B<int>::B<int>()
friend B<int>::B()
wyników w
../src/main.cpp:15: error: no ‘void B::B()’ member function declared in class ‘B’
podczas usuwania szablonu całkowicie
class A;
class B
{
private:
A* a;
public:
B();
};
class A : public B
{
private:
friend B::B();
int x;
};
B::B()
{
a = new A;
a->x = 5;
}
int main() { return 0; }
kompiluje i wykonuje dobrze - pomimo mojego IDE mówiącego przyjaciela B :: B() jest nieprawidłowa składnia?
Visual C++ 2008 nie akceptuje 'przyjaciela B :: B()', ale ma to miejsce w przypadku Comeau. –
Visual C++ 2008 akceptuje 'przyjaciela B :: B ()' chociaż, nawet jeśli rozszerzenia językowe są wyłączone. Dlaczego GCC (4.1) nie zaakceptuje tego? –
Kyle
Jeśli ktoś nie wie (ja nie), konstruktorzy mogą zostać ogłoszeni przyjaciółmi: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#263 –