拾遗:令人迷惑的写法
Posted 学习只为旅行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拾遗:令人迷惑的写法相关的知识,希望对你有一定的参考价值。
猜测:T是泛指类型,但是是类类型(之前是typename,现在直接限制死了:class)
猜测错误!这里的class和typename作用一摸一样!!!
#include <iostream>
#include <string>
using namespace std;
template < class T >
class Test
{
public:
Test(T t)
{
cout << "t = " << t << endl;
}
};
template < class T >
void func(T a[], int len)
{
for(int i=0; i<len; i++)
{
cout << a[i] << endl;
}
}
//
//
int a = 0;
class Test_1
{
public:
static const int TS = 1;
};
class Test_2
{
public:
struct TS
{
int value;
};
};
template
< class T >
void test_class()
{
typename T::TS * a; // 1. 通过泛指类型 T 内部的数据类型 TS 定义指针变量 a (推荐的解读方式)
// 2. 使用泛指类型 T 内部的静态成员变量 TS 与全局变量 a 进行乘法操作
}
int main(int argc, char *argv[])
{
// test_class<Test_1>();
test_class<Test_2>();
return 0;
}
如果这么写,编译时test_class<Test_2>();会报错,编译器更倾向于理解它为TS是个成员变量。加上typename就可以知道TS是个类型了
如果抛的是字符而不是约定好的int,下面虽然有catch(…)还是会报错!!!
#include <iostream>
#include <string>
using namespace std;
int func(int i, int j) throw(int, char)
{
if( (0 < j) && (j < 10) )
{
return (i + j);
}
else
{
throw '0';
}
}
void test(int i) try
{
cout << "func(i, i) = " << func(i, i) << endl;
}
catch(int i)
{
cout << "Exception: " << i << endl;
}
catch(...)
{
cout << "Exception..." << endl;
}
int main(int argc, char *argv[])
{
test(5);
test(10);
return 0;
}
小结
以上是关于拾遗:令人迷惑的写法的主要内容,如果未能解决你的问题,请参考以下文章