类定义

时间:2015-11-24 13:08:11

标签: c++ templates constructor template-specialization

我无法获得类内构造函数模板特化的正确语法,尽管尝试完全按照其他地方的方式进行复制。

考虑以下课程:

template<int A, int B>
struct Point {
    const int x;
    const int y;

    Point() : x(A), y(B) { std::cout << "Constructing arbitrary point" << std::endl; }
    void print() { std::cout << "Coords: " << x << ", " << y << std::endl; }
};

在类定义之外实现基于模板的专用构造函数,即

template<int A, int B>
struct Point {
    const int x;
    const int y;

    Point() : x(A), y(B) { std::cout << "Constructing arbitrary point" << std::endl; }
    void print() { std::cout << "Coords: " << x << ", " << y << std::endl; }
};

template<> Point<0, 0>::Point() : x(0), y(0) { std::cout << "Constructing origin" << std::endl; }

工作得很好。但是,当我尝试通过添加行

在类定义本身中这样做时
template<int A, int B>
struct Point {
    const int x;
    const int y;

    Point() : x(A), y(B) { std::cout << "Constructing arbitrary point" << std::endl; }
    template<> Point<0, 0>::Point() : x(0), y(0) { std::cout << "Constructing origin" << std::endl; }
    void print() { std::cout << "Coords: " << x << ", " << y << std::endl; }
};

我收到以下错误:

9:14: error: explicit specialization in non-namespace scope 'struct Point<A, B>'
9:35: error: invalid use of incomplete type 'struct Point<0, 0>'
4:8: error: declaration of 'struct Point<0, 0>'

我试图复制的另一个SO模板专业化问题: explicit-template-specialization-for-constructor

1 个答案:

答案 0 :(得分:2)

你不能。专业化需要一个完整的,明确定义的类型。因此,当编译器遇到您的Point<0,0>::Point()定义时,模板化类型Point仍然不完整。您尝试做的是在呈现规则之前解释异常。

在您提供的示例中,构造函数不是特化,而是另一种类型的模板(C)。