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

时间:2014-05-18 08:36:30

标签: c++ templates initialization-list

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

我已经找到了答案,但找不到合适的答案。最接近的答案是:C++ invoke explicit template constructor,但我不确定这是否与我的问题完全相关。 我的问题是,如果成员是模板类,如何在初始化列表中初始化结构B的成员?

Header 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

Header 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:&#39;数字&#39;无法隐式捕获,因为未指定默认捕获模式

有没有办法做到这一点,或者某些解决方法呢?

提前致谢:D

1 个答案:

答案 0 :(得分:2)

您提供给我们的代码不完整,或者已破坏。这一行:

New(pointer, Type *[u]);

似乎引用了一些缺少的成员方法或全局函数,或者它只是无效。错误信息有点神秘,但那是你的C ++。

我将假设New是某种宏,因为没有正常的函数(甚至是模板函数)可以将这种类型定义作为参数。你没有给我们New的定义,所以我们无法分辨。可能是这个宏的缺席(可能是某种内存调试系统的包装?)导致了疯狂的错误。

如果我用此替换New行:

pointer = new Type*[u];

代码编译得很好。