C++ 如果成员是模板类,则初始化初始化列表中某个类的成员

C++ 如果成员是模板类,则初始化初始化列表中某个类的成员,c++,templates,initialization-list,C++,Templates,Initialization List,[已解决]:问题不在模板类初始化中,而是在模板类构造函数中使用未定义宏的代码特定问题。编译器错误并没有抱怨未定义的符号,而是(错误地)与lambdas有关 我一直在寻找答案,但找不到确切的答案。最接近的答案在这里:但我不确定这是否完全与我的问题有关。 我的问题是,如果成员是模板类,我如何初始化初始化初始化列表中结构B的成员 标题类别A.h: #ifndef _A_ #define _A_ #include <typeinfo> #include <windows.h>

[已解决]:问题不在模板类初始化中,而是在模板类构造函数中使用未定义宏的代码特定问题。编译器错误并没有抱怨未定义的符号,而是(错误地)与lambdas有关

我一直在寻找答案,但找不到确切的答案。最接近的答案在这里:但我不确定这是否完全与我的问题有关。 我的问题是,如果成员是模板类,我如何初始化初始化初始化列表中结构B的成员

标题类别A.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
\ifndef\u A_
#定义_
#包括
#包括
模板类别A{
INTU,v;
类型**指针;
公众:
A();
A(整数);
~A();
类型和运算符[](int i){
typeid(Type);
返回*指针[i];
}
类型和获取(int i)
{
typeid(Type);
返回*指针[i];
}
类型*GetPointer(int i)
{
typeid(Type);
返回指针[i];
}   
输入*add();
类型和添加(类型*元素);
类型和添加(类型*元素,内部位置);
void expand(int NewLength);
无效交换(类型*元素,整数位置);
无效删除(整数);
消除空洞(类型*元素);
无效移除指针(整数);
void removePointer(类型*元素);
};
templateA::A(){
u=128;
v=10;
}
templateA::A(整数){
//一些与数字有关的事情;
u=数量;
v=10;
新的(指针,类型*[u]);
}  
模板A::~A()
{
}
模板void A::expand(int NewLength)
{
类型**NewList=NULL;
NewList=新类型*[NewLength];
}
模板类型*A::添加()
{
指针[u]=新类型;
}
模板类型&A::添加(类型*元素)
{
}
模板类型&A::添加(类型*元素,int位置)
{
}
模板void A::swap(类型*元素,int位置)
{
}
模板无效A::删除(类型*元素)
{
}
模板void A::removePointer(int nume)
{
}
模板void A::removePointer(类型*元素)
{
}
#恩迪夫
标题结构B.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
#pragma一次
#如果没有_
#定义_
#包括“ClassA.h”
结构C{
浮动x,y,z;
};
结构B{
私人:
B(){
}
公众:
int x,y;
A成员1;
A成员2;
B(整数X,整数Y):成员1(5),成员2(5){
//初始化x,y
}
无效添加(B*otherB){
B**U野菜=新B*;(*_野菜)=其他B;
成员1.添加(野菜);
}
};
#恩迪夫
编译器抱怨此错误(以及其他一些错误,如果需要,我可以发布):

错误C3493:由于未指定默认捕获模式,无法隐式捕获“number”

有没有办法做到这一点,或者有什么解决办法


提前感谢:D

要么您给我们的代码不完整,要么已损坏。这一行:

New(pointer, Type *[u]);
似乎正在引用某个缺少的成员方法或全局函数,或者它完全无效。错误消息有点神秘,但C++是你的。< /P> 我将假定
New
是某种宏,因为没有任何普通函数(即使是模板函数)可以将这种类型定义作为参数。你没有给我们新的定义,所以我们无法确定。可能是缺少这个宏(可能是某种内存调试系统的包装器?)导致了这个疯狂的错误

如果我将
新行
替换为以下内容:

pointer = new Type*[u];

代码编译得很好。

您发布的内容编译无误。请发布一个实际再现您的问题的最小代码示例。@Mat,好的,我将编辑代码您收到的错误消息仅适用于Lambdas。您百分之一百确定这是来自上述代码的错误消息吗?在这种情况下,这是一个VC++错误。我认为唯一有问题的是
B
的初始化列表,具体来说,它应该是
:x(x),y(y),member1(5)
,而这不会调用您描述的错误条件。完全没有初始化列表的B的私有构造函数和A的自定义默认构造函数有一种腐烂的设计气味,但肯定不会触发您报告的错误。@Arcoth,是的,其他错误也表明它们是用于Lambdas的。当我将“B(intx,inty):member1(5){}”改为“B(intx,inty){}”时,编译器不会抱怨,编译所有内容都没有错误……是的,我发现这行代码有问题。。。问题是我在整个项目中找不到New()的声明,但编译器并没有抱怨未定义的方法/函数,而是指出了一些其他错误(即与labda相关的错误…),这是使用一种语法有点复杂的语言所付出的代价。。。棘手的无论如何,
New
必须是宏。您从中继承代码的人可能在其VS配置中的某个位置定义了宏,而不是在其代码或项目中,或者你只是有不完整的代码。更令人费解的是,我在VS中启动了一个空白的新项目,只使用了我问题中发布的代码,编译器仍然抱怨lambda错误,而不是因为new()未定义…是的,我也认为这是一个宏。。。我的问题应该删除以避免混淆。不,把东西留给别人作为警告总是好的;-)