C++ c++;模板类成员结构初始化语法

C++ c++;模板类成员结构初始化语法,c++,visual-c++,C++,Visual C++,给定一个类: template <typename T> class foo { public: struct bar { bar(T value) { m_foo = value; } T m_foo; ... } ... } 当我尝试此操作时,会得到一个错误对(VS 2015): “myfoo”:不是类或命名空间名称 “bar”:找不到标识符 更新 下面是我想要实现的更详细的示例: template

给定一个类:

template <typename T>
class foo
{
public:
    struct bar
    {
        bar(T value) { m_foo = value; }
        T m_foo;
        ...
    }
    ...
}
当我尝试此操作时,会得到一个错误对(VS 2015):

“myfoo”:不是类或命名空间名称

“bar”:找不到标识符

更新 下面是我想要实现的更详细的示例:

template <typename T, typename T2, typename T3>
class MyClass
{
public:
    struct MyClassCreateParameters
    {
        MyClassCreateParameters( T t, T2 t2, T3 t3 )
            :
            T1Param( t ), T2Param( t2 ), T3Param( t3 ) { }

        T T1Param;
        T2 T2Param;
        T3 T3Param;
    };

    MyClass( const MyClassCreateParameters& params )
        :
        m_t1( params.T1Param ),
        m_t2( params.T2Param ),
        m_t3( params.T3Param ) { }

private:
    const T m_t1;
    const T2 m_t2;
    const T3 m_t3;
};

int main()
{
    MyClass< int, char, char* >* myclass;
    myclass = new MyClass< int, char, char* >(
        myclass::MyClassCreateParameters( 1, 'A', "abc" ) );

    return 0;
}
模板
类MyClass
{
公众:
结构MyClassCreateParameters
{
MyClassCreateParameters(T、T2、T3)
:
T1Param(t),T2Param(t2),T3Param(t3){
T-T1Param;
T2参数;
T3参数;
};
MyClass(常量MyClassCreateParameters和params)
:
m_t1(参数s.T1Param),
m_t2(参数T2Param),
m_t3(params.T3Param){}
私人:
常数m_t1;
常数T2 m_T2;
常数T3 m_T3;
};
int main()
{
MyClass*MyClass;
myclass=新的myclass(
myclass::MyClassCreateParameters(1,'A','abc”);
返回0;
}

使用C++11,您应该能够执行以下操作:

decltype(myfoo)::bar mybar;

使用C++11,您应该能够执行以下操作:

decltype(myfoo)::bar mybar;

从表面上看,我会使用typedef:

template <typename T1, typename T2, typename T3>
class MyClassTemplate
{
public:
    struct Params { /* ... */ };
    MyClassTemplate(Params);

    // ...
};

using MyClass = MyClassTemplate<int, char, char*>;

MyClass x(MyClass::Params(a, b, c));
模板
类MyClassTemplate
{
公众:
结构参数{/*…*/};
MyClassTemplate(Params);
// ...
};
使用MyClass=MyClassTemplate;
MyClass x(MyClass::Params(a、b、c));
但是,您也可以为类模板赋予转发构造函数模板:

template <typename T1, typename T2, typename T3>
class MyClassTemplate
{
private:
    struct Params { /* ... */ };
    MyClassTemplate(Params);

public:
    template <typename ...Args>
    MyClassTemplate(Args ...args) : MyClassTemplate(Params(args...)) {}
    // ...
};

MyClassTemplate<int, char, char*> x(a, b, c);
模板
类MyClassTemplate
{
私人:
结构参数{/*…*/};
MyClassTemplate(Params);
公众:
模板
MyClassTemplate(Args…Args):MyClassTemplate(Params(Args…){}
// ...
};
MyClassTemplateX(a、b、c);

表面上,我会使用typedef:

template <typename T1, typename T2, typename T3>
class MyClassTemplate
{
public:
    struct Params { /* ... */ };
    MyClassTemplate(Params);

    // ...
};

using MyClass = MyClassTemplate<int, char, char*>;

MyClass x(MyClass::Params(a, b, c));
模板
类MyClassTemplate
{
公众:
结构参数{/*…*/};
MyClassTemplate(Params);
// ...
};
使用MyClass=MyClassTemplate;
MyClass x(MyClass::Params(a、b、c));
但是,您也可以为类模板赋予转发构造函数模板:

template <typename T1, typename T2, typename T3>
class MyClassTemplate
{
private:
    struct Params { /* ... */ };
    MyClassTemplate(Params);

public:
    template <typename ...Args>
    MyClassTemplate(Args ...args) : MyClassTemplate(Params(args...)) {}
    // ...
};

MyClassTemplate<int, char, char*> x(a, b, c);
模板
类MyClassTemplate
{
私人:
结构参数{/*…*/};
MyClassTemplate(Params);
公众:
模板
MyClassTemplate(Args…Args):MyClassTemplate(Params(Args…){}
// ...
};
MyClassTemplateX(a、b、c);

发布一些可编译的代码,这些代码会给您带来错误。您使用“实现”这个词有点奇怪。您是否可以尝试让您的问题更清楚,使用标准术语,或者稍微扩展一下示例?@KerrekSB对于这个模糊的问题,请参阅更新的部分以了解更多信息。一些可编译的代码会给您带来错误。您对“实现”一词的使用有点奇怪。你能试着让你的问题更清楚,使用标准术语吗?或者把例子扩大一点吗?@KerrekSB很抱歉这个模糊的问题,请查看更新部分了解更多信息