[Решено]: проблема заключалась не в инициализации класса шаблона, а в специфичной для кода проблеме использования неопределенного макроса внутри конструктора класса шаблона. Ошибка компилятора не жаловалась на неопределенный символ, но была (ошибочно) связана с лямбда-выражениями.
Я искал ответ, но не нашел точного. Ближайший ответ здесь: С++ вызывает явный конструктор шаблонов, но я не уверен, что это полностью связано с моим вопросом. И мой вопрос: как я могу инициализировать член структуры B в списке инициализации, если член является классом шаблона?
Заголовок ClassA.h:
#ifndef _A_
#define _A_
#include <typeinfo>
#include <windows.h>
template<class Type> class A{
int u,v;
Type** pointer;
public:
A();
A(int number);
~A();
Type& operator[] (int i){
typeid(Type);
return *pointer[i];
}
Type& Get(int i)
{
typeid(Type);
return *pointer[i];
}
Type *GetPointer(int i)
{
typeid(Type);
return pointer[i];
}
Type* add ();
Type& add(Type *element);
Type& add(Type *element, int place);
void expand(int NewLength);
void swap(Type *element, int place);
void remove(int number);
void remove(Type *element);
void removePointer(int number);
void removePointer(Type *element);
};
template<class Type>A<Type>::A(){
u = 128;
v = 10;
}
template<class Type>A<Type>::A(int number){
//some thing to do with number;
u = number;
v = 10;
New( pointer, Type *[u] );
}
template <class Type> A<Type>::~A()
{
}
template <class Type> void A<Type>::expand(int NewLength)
{
Type **NewList = NULL;
NewList = new Type*[NewLength];
}
template <class Type> Type* A<Type>::add ()
{
pointer[u] = new Type;
}
template <class Type> Type& A<Type>::add(Type *element)
{
}
template <class Type> Type& A<Type>::add(Type *element, int place)
{
}
template <class Type> void A<Type>::swap(Type *element, int place)
{
}
template <class Type> void A<Type>::remove(Type *element)
{
}
template <class Type> void A<Type>::removePointer(int nume)
{
}
template <class Type> void A<Type>::removePointer(Type *element)
{
}
#endif
Заголовок StructB.h:
#pragma once
#ifndef _B_
#define _B_
#include "ClassA.h"
struct C{
float x,y,z;
};
struct B{
private:
B(){
}
public:
int x,y;
A<B*> member1;
A<C> member2;
B(int X,int Y) : member1(5),member2(5) {
//initialize x,y
}
void Add(B* otherB){
B** _pOtherB = new B*; (*_pOtherB) = otherB;
member1.add(_pOtherB);
}
};
#endif
Компилятор жалуется на эту ошибку (и некоторые другие ошибки, я могу опубликовать их, если нужно):
ошибка C3493: «число» не может быть неявно захвачено, поскольку не указан режим захвата по умолчанию
Есть ли способ сделать это или какой-то обходной путь?
Заранее спасибо
B
, в частности, он, вероятно, должен быть: x(X), y(Y), member1(5)
, и это не вызовет описанного вами состояния ошибки. Частный конструктор для B и пользовательский конструктор по умолчанию для A без списков инициализации совсем имеет гнилостный запах дизайна, но, конечно, не вызовет ошибку, о которой вы сообщаете. - person WhozCraig   schedule 18.05.2014Type
используется в коде, который вы выбрали не для публикации в шаблоне классаA
? - person WhozCraig   schedule 18.05.2014