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很抱歉这个模糊的问题,请查看更新部分了解更多信息