ano*_*non 2 c++ templates visual-c++ c++17
考虑以下代码:
template <typename T>
struct X
{
void foo(){}
};
class Y { };
template <typename T, typename... U>
class Example {
protected:
template <template<typename> typename example_t>
using alias = X<example_t<T>>;
};
template <typename T>
struct ExampleA : public Example<T, Y>
{
using MyAlias = ExampleA::alias<ExampleA>;
};
Run Code Online (Sandbox Code Playgroud)
在C ++ 14中,我可以执行以下操作并使它按预期工作:
ExampleA<int>::MyAlias test;
test.foo();
Run Code Online (Sandbox Code Playgroud)
现在最近升级到C ++ 17会发出警告'ExampleA<T>::alias': dependent name is not a type以及syntax error: identifier 'alias'。
通常,当您遇到涉及a的事物时,dependent name这意味着您需要添加typename关键字,如以下示例所示(iterator取决于std::vector<T>):
template<typename T>
void bar() {
/* typename */ std::vector<T>::iterator it;
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为情况并非如此。同样,使用using MyAlias = Example<T, Y>::alias<ExampleA>;结果也会导致相同的错误。
C ++ 17中的更改是否使该代码无效,或者这是编译器错误?我该怎么做才能在C ++ 17中解决此问题?
MSVC忽略了歧义消除器的缺席,因为它们的编译器实现细节。
通过新的改进和对编译器的重新设计,他们现在可以按需实现两阶段名称查找。但是,在实施该功能后,在某些情况下确实很难忽略脱歧剂的存在。
他们对/permissive-标志的要求更加严格,由于先前缺乏两阶段名称查找,因此尝试禁用大多数扩展。
使用去歧义符的代码段如下所示:
template <typename T>
struct ExampleA : public Example<T, Y>
{
using MyAlias = typename ExampleA::template alias<ExampleA>;
};
Run Code Online (Sandbox Code Playgroud)
将其视为升级代码的兼容性和可移植性的机会。
但是,对于C ++ 20,现在许多需要使用去歧义词的情况是可选的:
template<typename T>
auto wrapper() -> T::type; // no typename!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |