我有一段代码,它是做模板专门化的常用模式。为了移除main函数第一行中为Processor1指定DataType1的要求,我想改为接收一个template模板参数。看起来using指令不支持分配“open”模板参数,而且我在web中找不到任何这样的示例(可能我没有使用适当的关键字进行搜索...)
#include <iostream>
struct DataType1 {};
struct DataType2 {};
template<class TDataType>
struct BaseMessage{ using DataType = TDataType; };
template<class TDataType>
struct ChildMessage : public BaseMessage<TDataType> {};
template<class TDataType>
struct Processor1 {
static void func() { std::cout << "Processor1" << std::endl; }
};
template<class TDataType>
struct Processor2 {
static void func() { std::cout << "Processor2" << std::endl; }
};
template<class TResult>
struct FindDefaultProcessor;
template<>
struct FindDefaultProcessor<DataType1>
{
using type = Processor1;
};
template<class TResult, template<class> class TProcessor = FindDefaultProcessor<TResult>::type>
void func()
{
TProcessor<typename TResult::DataType>::func();
}
int main()
{
func<ChildMessage<DataType2>, Processor1>();
return 0;
}
所以问题很“简单”,我如何让这段代码编译呢?在FindDefaultProcessor中,使用type=Processor1不会编译。我需要一个机制来检索一个仍然“打开”的类型。
谢谢!
您可能是指processor1
不是类型
template<>
struct FindDefaultProcessor<DataType1>
{
template <typename U>
using type = Processor1<U>;
};
并且需要额外的关键字template
:
template<class TResult,
template<class> class TProcessor = FindDefaultProcessor<TResult>::template type>
^^^^^^^^
演示
还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案
我试图编写一个可变函数模板来计算的字节大小。这将用于一个网络编程项目,我正在工作。第一步,我在没有工作的variadic模板的情况下想出了这个: 错误代码#2。如果我将variadic模板放在不同的位置: 我得到了 错误:重载的'size t ()'调用不明确
在本文中,他们说(c)是(b)的显式专门化。我的疑问是,为什么我们不能说它是(a)的显式专门化?因为我们可以为任何特定类型专门化模板。所以,当专门化int*时,为什么他们说(c)显式专门化(b)。 任何评论都将有助于理解事情。
我有以下模板方法: 但是我得到了那些奇怪的链接错误: /usr/lib/gcc/x86_64-redhat-linux/4.4。7/../../../../包括/c/4.4。7/例外:62:void MyStruct::readField(std::basic_istream)的多重定义 如何专门化此成员函数? 编辑 这种方法在以下方面起作用: 或者使用s或在类外使用
关于下一个代码,我有一些问题: > 类专业化
在G++中如何做到这一点? 声明类模板ss。[确定] 取消静态函数模板f[ok] 如何专门化f?[错误] 这段代码对于VC++是可以的。 在线:https://godbolt.org/z/qgq6bp