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

标签 c++ templates initialization-list

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

我已经搜索过答案,但找不到确切的答案。最接近的答案在这里: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 结构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

编译器提示这个错误(以及其他一些错误,如果需要我可以发布):

错误 C3493:无法隐式捕获“数字”,因为未指定默认捕获模式

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

提前致谢:D

最佳答案

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

New(pointer, Type *[u]);

似乎引用了一些缺失的成员方法或全局函数,或者它只是无效的。错误消息有点神秘,但这就是适合您的 C++。

我假设 New 是某种宏,因为没有普通函数(即使是模板函数)可以将这种类型定义作为参数。您没有给我们New 的定义,所以我们无法判断。可能是缺少这个宏(可能是某种内存调试系统的包装器?)导致了这个疯狂的错误。

如果我将 New 行替换为:

pointer = new Type*[u];

代码编译正常。

关于c++ - 如果成员是模板类,则在初始化列表中初始化某个类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23720041/

相关文章:

c++ - 将一个函数传递给 C++ 中的另一个函数,其中参数的数量可以不同

c++ - ofstream.put 无法正常工作

javascript - 如何在 JavaScript 代码中使用 JavaScript 模板代码?

C++ : passing a const *p in initialization list

C++/OpenCV 无法初始化 3D Mat

c++ - const 成员函数中模板成员的常量

templates - 避免 groovy 模板中的新断线

c# - 基本成员初始化部分 C#?

c++ - BOOST_THROW_EXCEPTION 在初始化列表中缺少三元运算符的解决方法

c++ - 为什么 clang/llvm 不对此进行优化?