猿问

用VS 2008 和 G++编译都出问题,都说D1,D2和B的作为func的形参不合法?为什么?

STL源码解析中有这样的一段代码:
------------------------------------------------------------------------------------

#include <iostream>
using std::cout;
using std::endl;
struct B {};
struct D1:public B{};
struct D2:public D1{};

template <class I>
func(I& p, B)
{ cout<< "B version "<<endl; }

template <class I>
func(I& p, D2)
{ cout<< "D2 version "<<endl; }

template <class I>
func(I& p, D1)
{ cout<< "D1 version "<<endl; }

int main()
{
int *p;
func(p, B());
func(p, D1());
func(p, D2());
return 0;
}

可是用VS 2008 和 G++编译都出问题,都说D1,D2和B的作为func的形参不合法。
报错:
g++ 报错:
testTag.cpp:11:13: 错误:ISO C++ 不允许声明无类型的‘func’
testTag.cpp:15:14: 错误:ISO C++ 不允许声明无类型的‘func’
testTag.cpp:19:14: 错误:ISO C++ 不允许声明无类型的‘func’

VS 2008报错:
1>d:\workspaces\vs 2008\projects\practicekaa\practicekaa\tagtest.h(22) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
--------------------------------------------------------------------------------------

为什么不行呢?

波斯汪
浏览 126回答 2
2回答

摇曳的蔷薇

形参呀,d1 d2 b是类型,不是参数,要参数名func(I& p, B xc)func(I& p, D2 xc)func(I& p, D1 xc)

肥皂起泡泡

ISO C++ 不允许声明无类型的‘func’, 注意: C++ 不支持默认 int.提示很明显了, 你的函数模板把返回值漏掉了.
随时随地看视频慕课网APP
我要回答