如何使用类的模板参数作为类成员的模板参数
How can I use the template parameter of a class as the template parameter of a class member?
我正试图在C++中实现以下内容:
template <class T>
class Inner
{
public:
Inner(T inData){data = inData;};
~Inner(void){};
T data;
};
template <class T>
class Outer
{
public:
Outer(Inner<T> in){inner = in;};
~Outer(void){};
Inner<T> inner;
};
int main(void)
{
Inner<int> in (10);
Outer<int> out (in);
std::cout << out.inner.data;
}
在MSVS 2010中编译,我得到以下错误:
c:...main.cpp(15): error C2512: 'Inner<T>' : no appropriate default constructor available
with
[
T=int
]
c:usersgaffdocumentsvisual studio 2010projectspgp(c++)pgp(c++)main.cpp(15) : while compiling class template member function 'Outer<T>::Outer(Inner<T>)'
with
[
T=int
]
c:usersgaffdocumentsvisual studio 2010projectspgp(c++)pgp(c++)main.cpp(24) : see reference to class template instantiation 'Outer<T>' being compiled
with
[
T=int
]
很明显,我在这里缺少了一些基本的理解,但我不知道如何解决这个问题,甚至不知道我试图实现的目标是否可能。
值得一提的是,这里有一个编译起来没有任何问题的Java实现:
public class Inner<T> {
public T data;
public Inner(T inData) {
data = inData;
}
}
public class Outer<T> {
public Inner<T> inner;
public Outer(Inner<T> in) {
inner = in;
}
}
public class Main {
public static void main(String args[]){
Inner<Integer> in = new Inner<Integer>(10);
Outer<Integer> out = new Outer<Integer>(in);
System.out.println(out.inner.data);
}
}
有什么建议吗?
干杯
JimmidyJoo
问题是您没有内部的默认构造函数。当编译器初始化对象时,它会在赋值之前调用inner
的默认构造函数。
编辑:
正确地实现复制构造函数并初始化内部可能是个好主意,如下所示:
Outer(Inner<T> in) : inner(in) { };
你可以这样使用复制构造函数:
Inner(const Inner<T> & in) : data(in.data){
}
您需要在构造函数中使用初始值设定项列表:
Outer(Inner<T> in): inner(in) {}
否则,构造函数在进入构造函数之前必须默认构造内部。这是不可能的,因为没有默认的构造函数。
相关文章:
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 使用指向成员的指针将成员函数作为参数传递
- 如何将lambda作为模板类的成员函数参数
- 将成员函数指针作为参数传递给模板方法
- c++构造函数成员初始化:传递参数
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 模板化检查是否存在带有参数列表的类成员函数?
- 如何将类成员方法的参数列表自动填充写入可变参数?
- 为什么我需要在成员发起器列表中重复基类的模板参数?
- C++向量默认为成员参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 可变参数模板参数扩展 类型为 std::function 的类成员
- 绑定到可变参数成员函数
- C/C++ 包含点的宏参数(成员访问运算符)
- 将const char * const参数成员分配给新值
- 基于模板参数成员函数参数的模板专用化
- 如何访问可变参数成员
- 可变类参数成员变量的异构存储
- 非模板类中的可变参数成员