这是对上一个问题here的后续跟进。基本上,以下程序
#include <memory>
// Create a class parameterized on a template
template <template <typename> class XX>
struct Foo{};
// Some template with a long name
template <typename T>
struct ReallyLongFileNameThatIHateToType {
};
// Alias to shorten name
template <typename T>
using Bar = ReallyLongFileNameThatIHateToType <T>;
int main() {
std::unique_ptr<Foo<ReallyLongFileNameThatIHateToType>> foo =
std::make_unique<Foo<Bar>>();
}
适用于gcc而不是clang
g++ -std=c++14 test04.cpp -o test04
clang++ -std=c++14 test04.cpp -o test04
test04.cpp:20:61: error: no viable conversion from 'unique_ptr<Foo<template
Bar>>' to
'unique_ptr<Foo<template ReallyLongFileNameThatIHateToType>>'
std::unique_ptr<Foo<ReallyLongFileNameThatIHateToType>> foo =
^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include/g++-v4/bits/unique_ptr.h:200:17: note:
candidate constructor not viable: no known conversion from 'typename
_MakeUniq<Foo<Bar> >::__single_object' (aka 'unique_ptr<Foo<Bar> >') to
'nullptr_t' for 1st argument
constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { }
^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include/g++-v4/bits/unique_ptr.h:205:7: note:
candidate constructor not viable: no known conversion from 'typename
_MakeUniq<Foo<Bar> >::__single_object' (aka 'unique_ptr<Foo<Bar> >') to
'std::unique_ptr<Foo<ReallyLongFileNameThatIHateToType>,
std::default_delete<Foo<ReallyLongFileNameThatIHateToType> > > &&' for 1st
argument
unique_ptr(unique_ptr&& __u) noexcept
^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include/g++-v4/bits/unique_ptr.h:356:7: note:
candidate constructor not viable: no known conversion from 'typename
_MakeUniq<Foo<Bar> >::__single_object' (aka 'unique_ptr<Foo<Bar> >') to
'const std::unique_ptr<Foo<ReallyLongFileNameThatIHateToType>,
std::default_delete<Foo<ReallyLongFileNameThatIHateToType> > > &' for 1st
argument
unique_ptr(const unique_ptr&) = delete;
^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include/g++-v4/type_traits:1957:41: note:
candidate template ignored: disabled by 'enable_if' [with _Up = Foo<Bar>,
_Ep = std::default_delete<Foo<Bar> >]
using _Require = typename enable_if<__and_<_Cond...>::value>::type;
^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include/g++-v4/bits/unique_ptr.h:228:2: note:
candidate template ignored: could not match 'auto_ptr' against
'unique_ptr'
unique_ptr(auto_ptr<_Up>&& __u) noexcept;
^
1 error generated.
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1
正如链接消息中所指出的,这是CWG问题1244.无论如何,还有另一种缩短与clang一起使用的名称的方法吗?通常,我在模板类上有代码参数,但我不想一遍又一遍地输入完整的参数名称。使用gcc时,我只需创建别名模板并将其称为一天。显然,对于clang,这不起作用,那么是否有不同的机制来实现相同的效果?
答案 0 :(得分:0)
作为一种解决方法,您可以通过将模板模板模板参数传递给某个帮助程序结构来使其与您的模板模板参数进行设置,从而使其以其他方式工作。 (在clang ++,c ++ 14中工作):
#include <memory>
// Create a class parameterized on a template
template <template <typename> class XX>
struct Foo{};
// Some template with a long name
template <typename T>
struct ReallyLongFileNameThatIHateToType {
};
template <template <template <class> class> class FF>
struct Bar {
using type = FF<ReallyLongFileNameThatIHateToType>;
};
template <template <template <class> class> class FF>
using Bar_t = typename Bar<FF>::type;
int main() {
std::unique_ptr<Foo<ReallyLongFileNameThatIHateToType>> foo =
std::make_unique<Bar_t<Foo>>();
}