无法正确理解这种讨厌的 CRTPish 语法
Can't get this pesky CRTPish syntax right
请考虑以下代码:
class A {
virtual void foo() = 0;
};
template <template <typename... Ts> class SubA, typename... Ts>
class Helper : public A {
static void bar();
virtual void foo() override final {
return bar();
}
};
template <typename T>
class NiceA : Helper<NiceA, T> { };
这将编译。编辑:如果我现在添加:
template <>
void Helper<NiceA, int>::bar()
{
std::cout << "Hi." << std:: endl;
}
此显式实例化将编译。但是如果我添加:
template <typename T>
void Helper<NiceA, T>::bar()
{
std::cout << "Hi." << std:: endl;
}
此操作失败并显示错误:
a.cpp:22:28: error: invalid use of incomplete type ‘class Helper<NiceA, T>’
void Helper<NiceA, T>::bar()
^
a.cpp:10:7: error: declaration of ‘class Helper<NiceA, T>’
class Helper : public A {
^
为什么?
注意:使用 gcc 4.9.3 编译。
首先,请注意,这与CRTP无关,即它与NiceA
继承无关Helper
。此外,它与从A
或该虚函数继承Helper
无关。
因此,这是该问题的实际代码:
template <template <typename... Ts> class SubA, typename... Ts>
class Helper
{
static void bar();
};
template <typename T>
class NiceA
{
};
template <> // This compiles fine
void Helper<NiceA, int>::bar()
{
}
template <typename T> // This does not
void Helper<NiceA, T>::bar()
{
}
int main()
{
}
只是说,因为通过提供MCVE,您可以使那些想要给出答案的人的工作更轻松。
现在,为什么它不编译?不能部分专用化单个成员函数。时期。
您需要部分专业化整个班级。
// Partially specialize Helper
template <typename T>
class Helper<NiceA, T>
{
static void bar();
};
// Now implement the member function
template <typename T>
void Helper<NiceA, T>::bar()
{
}
你只是错误地定义了你的成员函数:
template <typename T>
void Helper<NiceA, int>::bar()
{
std::cout << "Hi." << std:: endl;
}
这将是Helper<NiceA, int>
中bar<T>()
的函数模板的定义。但bar()
只是一个普通函数,因此您无需指定任何模板参数:
template <> // <== nothing
void Helper<NiceA, int>::bar()
{
std::cout << "Hi." << std:: endl;
}
Clang的错误在这个特定实例中更有帮助:
main.cpp:19:1: error: template parameter list matching the non-templated nested type 'Helper<NiceA, int>' should be empty ('template<>')
template <typename T>
^ ~~~~~~~~~~~~
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 使用基类指针调用基类的值构造函数的语法是什么?
- 很好的语法来获取对向量/数组数据的大小引用?
- C++语法运算符功能?
- C++使用 rand 定义函数语法
- 什么文件可以修改 atom 的C++语法?
- 创建模板嵌套类实例的语法?
- C++语法差异:二维和一维数组(指针算术)
- 无法正确理解这种讨厌的 CRTPish 语法