查找模板参数的类型
Finding typeid of a template parameter
构造函数定义中的print语句没有打印,构造函数在main中调用正确吗?我知道我遗漏了什么,请指出来。
#include <iostream>
#include <typeinfo>
template <typename T> class List
{
public:
template <typename T2> List (List<T2> const&);
};
template <typename T> template <typename T2> List <T> :: List (List <T2> const&)
{
std :: cout << "nType name:" << typeid (T2).name();
}
int main ()
{
List <int> kk (List <int>);
return 0;
}
在您的代码中有一些您可能没有意识到的错误。
List<int> kk( List<int> );
这一行不是变量定义,而是一个函数的声明,该函数以List<int>
作为参数并返回List<int>
,因此实际上不会调用任何构造函数。这就是众所周知的最令人烦恼的解析(你可以在SO中搜索它的不同版本,或者在c++ FAQ生活中搜索)
第二个问题是,您不可能创建List
的实例化类型的任何实例,原因是,您提供的唯一构造函数是一个模板化的构造函数,它将第二个List<U>
作为参数。这有效地禁用了默认构造函数,因此创建List<T>
的唯一方法是已经有了List<U>
,而这是不可能的。您可以重新添加默认构造函数:
template <typename T>
class List {
public:
List() {}
template <typename U>
List( List<U> const & ) {} // prefer const& as that will avoid unnecessary copying
};
现在你可以写:
List<int> l = List<int>(); // this will call List<int>::List( List<int> const & )
然而,这仍然不会调用你想要的构造函数。原因有点模糊,但是当复制构造模板中的元素时,编译器将不使用模板化的构造函数。在上面的代码中,它将隐式地定义一个复制构造函数,方法是对方法进行逐个成员的复制构造函数,并调用生成的构造函数。这意味着在大多数情况下,当您想要提供一个模板化的构造函数时,您还需要提供一个非模板化的复制构造函数。
要真正调用这个构造函数,你必须提供一个不同的类型:
List<int> l = List<double>();
由于类型实际上不同,编译器不能复制构造,将发现所提供的模板化构造函数是最佳的重载候选者并调用它
以及David确定的"最令人烦恼的解析":
- 你需要至少有一个构造函数来创建原始的List对象传递给复制构造函数,
- 你需要改变参数类型,以便调用模板化的复制构造函数:因此,你将匹配隐式声明的
List(const List&)
复制构造函数。
:
#include <iostream>
template <typename T>
struct X
{
X() { std::cout << "X()n"; }
// implicitly like this anyway...
// X(const X& rhs) { std::cout << "X(X&)n"; }
template <typename U>
X(const U& u) { std::cout << "Un"; }
};
int main()
{
X<int> x;
X<int> y(x);
}
你想用这句话做什么:
List <int> kk (List <int>);
(它实际上声明了一个函数,并且只能是函数声明)
为了查看复制构造函数的输出,您必须以某种方式调用复制构造函数。这就意味着复制对象。用你的代码是不可能的给定:由于您已经显式声明了构造函数,因此编译器不会提供默认构造函数,您也没有用于创建对象的其他构造函数。所以你有没有办法创造任何可以复制的东西。如果添加
List() {}
到类,并写入:
List<int> kk((List<int>());
,您可能会得到一些东西,但编译器允许省略这里的拷贝,所以更有可能没有输出。试一试:
List<int> a;
List<int> b(a);
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为模板传递非类型参数 agument
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- c++非类型参数包扩展
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 在不同的模板参数包之间分发非类型参数包
- 如何在使用容器和字符串时强制使用显式分配器类型参数
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 作为模板类型参数,为什么 type[N] 与其专用版本不匹配----模板<类 T>类 S<T[]>
- C++ 模板:重载时找不到基类类型参数方法