我有几个模板参数的模板结构
template<class Result, class T, class K>
struct MyClass
{
public:
Result foo()
{
return Result{};
}
};
此结构适用于所有模板,但结果无效的情况除外。我知道,Result{}
不能实现为void类型,所以我当前的解决方案是使用如下的部分专门化:
template<class T, class K>
struct MyClass<void, T, K>
{
public:
void foo()
{
return;
}
};
这允许执行以下操作:
int main()
{
MyClass<void, double, char> mycl1;
MyClass<int, double, char> mycl2;
mycl1.foo();
mycl2.foo();
}
有没有一种方法可以使mycl1.foo()
编译而不会在C 14标准中进行部分类特化?我可以使用,如果配置器
和类型traitis_void_v
组合,但我想找到是否有一种方法:
>
模板类方法的特殊化部分显式
模板类方法的实例化
虽然你做不到
Result foo()
{
return Result{};
}
如果结果
为无效
,则可以使用
Result foo()
{
return Result();
}
这种情况下的行为是相同的,您将获得一个值初始化的对象返回。当Result
是val
by[expr.type.conv]\2时,允许使用此语法
如果初始值设定项是一个带括号的单表达式,则类型转换表达式与相应的强制转换表达式等价(定义为,如果定义为含义)。如果类型为cv void,初始值设定项为(),则表达式是指定类型的prvalue,不执行初始化。否则,表达式是指定类型的prvalue,其结果对象由初始值设定项直接初始化。对于形式为T()的表达式,T不应是数组类型。
即将到来,尽管你将能够使用
return Result{};
即使Result
是void
,当c20添加到该部分时,{}
也适用于void
。[expr.type.conv]\2现在声明
如果初始值设定项是带括号的单个表达式,则类型转换表达式等效于相应的强制转换表达式。否则,如果类型为cv void且初始值设定项为()或{}(包扩展后,如果有),则表达式是指定类型的prvalue,不执行初始化。否则,表达式是指定类型的prvalue,其结果对象由初始值设定项直接初始化。如果初始值设定项是带括号的可选表达式列表,则指定的类型不应是数组类型。
还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案
问题内容: 这是我的代码: 它运作良好。但是当我尝试添加这个 我遇到编译器错误:«int MyClass :: DoSomething()»的«>»令牌模板标识«DoSomething <0>»之前的无效显式专门化与任何模板声明都不匹配 我使用g ++ 4.6.1应该怎么做? 问题答案: 不幸的是,如果不对外部模板进行特殊化处理,就不能对作为类模板成员的模板进行特殊处理: C ++ 11 14.7
请向我解释选择模板专用化的规则。我举一个例子: 为什么输出为?一般来说,专用类中的默认模板参数会发生什么情况?它会带来一些影响吗?
对于DynamicMessage,我想使用不同的处理方式,所以我尝试了 但它给出了编译错误 com中的“addMessageToResult(Message,Descriptor,Builder)”。谷歌。云垂直方向。电信公司。taap。数据流。数据摄取。常见的解析器。CSVParserDynamicMessage与com中的addMessageToResult(Message,Descripto
这个问题可能太难在标题中的on句子中描述,但这里有一个最小的例子: 当两种类型相同时 当这两种类型是同一类型的类模板的实例化时 天真地说,我们希望第二个部分专门化不会与第一个不明确,因为它感觉“更专门化”,对基础模板上和的推导类型施加更多限制。然而,主要的编译器似乎同意我们的期望是错误的:为什么它不被认为是更专业化的?