我正在创建一个特征类来帮助我的程序。我有一个名为的模板类operations,其中包含方法display和area。当我定义这些函数时,我收到错误。他们来了:
错误:专门化成员
‘traits::operations<Rectangle>::display’需要‘template<>’语法
错误:专门化成员‘traits::operations<Rectangle>::area’需要‘template<>’语法
template <>正如您所看到的,编译器希望我在这些定义之前插入。但当我这样做时,我会得到一大页错误。出了什么问题以及如何修复它?
这是我的程序。
namespace traits
{
template <typename P>
struct operations
{
static void display(Rectangle const &, std::ostream &);
static void area(Rectangle const &);
};
template <typename P, int N>
struct access {};
}
namespace traits
{
template <int N>
struct access<Rectangle, N>
{
static double get(Rectangle const &);
};
}
// The errors occur here
namespace traits
{
static void operations<Rectangle>::display(Rectangle const &rect, std::ostream &os)
{
os << rect.width << '\n';
os << rect.height << '\n';
os << area(rect) << '\n';
}
static void operations<Rectangle>::area(Rectangle const& rect)
{
double width = get<0>(rect);
double height = get<1>(rect);
return width * height;
}
}
namespace traits
{
template <>
struct access<Rectangle, 0>
{
static double get(Rectangle const &rect)
{
return rect.width;
}
};
template <>
struct access<Rectangle, 1>
{
static double get(Rectangle const &rect)
{
return rect.height;
}
};
}
template <int N, typename P>
static inline double get(P const &p)
{
return traits::access<P, N>::get(p);
}
template <typename P>
static inline void display(P const &p)
{
traits::operations<P>::display(p, std::cout);
}
template <typename P>
static inline double area(P const &p)
{
return traits::operations<P>::area(p);
}
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
这是一个显示错误的程序 - http://ideone.com/WFlnb2#view_edit_box
感谢任何和所有的帮助。
感谢评论的帮助,我摆脱了这两个错误,但在添加声明template<>并修复返回类型后我没有得到更多错误area:
错误:无法声明成员函数
‘static void traits::operations<P>::display(const Rectangle&, std::ostream&) [with P = Rectangle; std::ostream = std::basic_ostream<char>]’具有静态链接 [-fpermissive]
错误:显式模板专业化不能有存储类
错误:‘static double traits::operations<P>::area(const Rectangle&) [with P = Rectangle]’实例化后的专业化
错误:显式模板专业化不能有存储类
你的函数 :display应该area这样写:
template <>
double operations<Rectangle>::area( Rectangle const& rect )
{
double width = get<0>(rect);
double height = get<1>(rect);
return width * height;
}
Run Code Online (Sandbox Code Playgroud)
template <>应该放在函数的头部。static不应出现在函数的定义主体中。| 归档时间: |
|
| 查看次数: |
15040 次 |
| 最近记录: |