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
) 上的模板。
我无法获得 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
) 上的模板。