模板成员函数的参数推导不适用于函数内部声明的类
Argument deduction for template member functions does not work for classes declared inside function?
struct Test
{
template <class T>
void print(T& t)
{
t.print();
}
};
struct A
{
void print() {printf( "A");}
};
struct B
{
void print() {printf( "B");}
};
void test_it()
{
A a;
B b;
Test t;
t.print(a);
t.print(b);
}
这汇编得很好。
struct Test
{
template <class T>
void print(T& t)
{
t.print();
}
};
void test_it()
{
struct A
{
void print() {printf( "A");}
};
struct B
{
void print() {printf( "B");}
};
A a;
B b;
Test t;
t.print(a);
t.print(b);
}
此操作失败,并出现错误:对"测试::打印(Test_it((::A&("的调用没有匹配的函数
有人能解释一下为什么会发生这种事吗?谢谢
在第二个示例中,A
和B
是局部类型,根据§14.3.1/2,它们不能用作C++03中的模板类型参数:
本地类型、没有链接的类型、未命名类型或由这些类型组合而成的类型不得用作模板类型参数的模板参数。
相关文章:
- 使用一个参数的模板函数时出错(适用于 2)
- 模板函数仅适用于VS
- 如何使此函数适用于 100 个对象 (c++)?
- 没有适用于 std::unique_ptr 的适当默认构造函数
- 继承函数是否适用于 C++ 中的基类元素或派生类元素?
- 为什么不区分大小写适用于 std::unordered_set的 std::hash 函数?
- 如何创建适用于 lambda 表达式的排序函数
- Qt C++macOS问题。我正在使用函数 .find( "a word") 在多集中搜索单词,它适用于 Windows 但不适用于 mac
- 多态性是否适用于值?或者在按(基)值返回时使用派生类的移动构造函数
- 函数指针数组的类模板参数推导适用于 clang,但不适用于 gcc
- 为什么模板函数只基于返回类型适用于C++
- 是否有适用于 stream2 或 stream3 函数的代码
- 为什么OpenCV构造函数适用于iPhone5而不适用于iPhone6/iPad
- 声明引用适用于类,但不适用于主函数
- 为什么函数模板不理解 NULL,但适用于 nullptr
- 如何获取 Linux 中 mmap() 函数的 FileDescriptor 的内存地址,适用于 Video4Linux
- 在构造函数类中初始化 ofstream,仅适用于 c++11
- C++模板机制来获取函数参数的数量,这将适用于 lambda 和普通函数
- 名称篡改是否适用于c++中的虚拟函数
- 如何在新程序中包含来自其他c++文件的函数(适用于Mac OSX应用程序)