专业成员S :: display需要'template<>'语法

时间:2013-05-11 02:31:48

标签: c++

我正在创建一个特质课来帮助我的程序。我有一个名为operations的模板类,其中包含方法displayarea。当我定义这些函数时,我会收到错误。他们在这里:

  

错误:专门成员‘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()
{

}

这是一个显示错误的程序 - 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]’的特化   错误:显式模板专门化不能有存储类

2 个答案:

答案 0 :(得分:3)

您的功能:displayarea应该这样写:

    template <>
    double operations<Rectangle>::area( Rectangle const& rect )
    {
            double width =  get<0>(rect);
            double height = get<1>(rect);

            return width * height;
    }
  • 对于模板专用函数,应放置template <> 在功能的头部。
  • 对于静态成员函数,static不应出现在 定义函数体。

答案 1 :(得分:1)

template< typename P > // P is declared here
struct operations  {
    ... // into this scope
}; // but it goes out of scope here

template< typename P > // So it needs to be redeclared
void operations::display( Rectangle const &, std::ostream &) {
    ... // for this scope.
}

函数display不“拥有”其参数的名称。必须在定义中重新声明模板参数。编译器消息指的是template<>语法,建议你在<>括号内放置一些东西,但是容易混淆,将括号留空,字面上说template<>意味着别的东西 - 显式特化,这不是不管你想要什么。

另一方面,static是成员函数的一个属性,它在定义中提到了 not 。在使用定义签名的其他部分将其与声明签名匹配后,编译器会记住static。因此,您应该从定义中删除static