1

[解決済み]: 問題はテンプレート クラスの初期化ではなく、テンプレート クラス コンストラクター内で未定義のマクロを使用するというコード固有の問題でした。コンパイラ エラーは、未定義のシンボルについては文句を言いませんでしたが、(誤って) ラムダに関連していました。

答えを探しましたが、正確な答えが見つかりませんでした。最も近い答えはここにあります:C++は明示的なテンプレートコンストラクターを呼び出しますが、それが私の質問に完全に関連しているかどうかはわかりません. 私の質問は、メンバーがテンプレート クラスの場合、初期化リストで構造体 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: 既定のキャプチャ モードが指定されていないため、'number' を暗黙的にキャプチャすることはできません

これを行う方法、またはおそらくいくつかの回避策はありますか?

前もって感謝します:D

4

1 に答える 1

2

提供されたコードが完全ではないか、壊れています。この行:

New(pointer, Type *[u]);

欠落しているメンバー メソッドまたはグローバル関数のいずれかを参照しているように見えるか、単に無効です。エラー メッセージはちょっと不可解ですが、それは C++ です。

New通常の関数 (テンプレート化された関数であっても) は、この種の型定義をパラメーターとして受け取ることができないため、これはある種のマクロであると仮定します。あなたは私たちに の定義を与えていないNewので、私たちが知る方法はありません. おそらく、このマクロが存在しないことが原因です (おそらく、ある種のメモリ デバッグ システムのラッパーでしょうか?)。

行を次のように置き換えるNewと:

pointer = new Type*[u];

コードは正常にコンパイルされます。

于 2014-05-18T10:30:32.793 に答える