class 定义中构造函数的模板特化

Template specialization of constructor within class definition

我无法获得 in-class 构造函数模板特化的正确语法,尽管我试图完全按照在其他地方所做的那样进行复制。

考虑以下 class:

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; }
};

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

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; }

工作正常。但是,当我尝试通过添加行

在 class 定义本身中这样做时
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

你不能。专业化需要一个完整的、定义明确的类型。因此,当编译器遇到您的 Point<0,0>::Point() 定义时,模板化类型 Point 仍然不完整。您要做的是在提出规则之前解释例外情况。

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