gpt4 book ai didi

c++ - 使用 decltype : work on g++ but not on Visual C++ 显式实例化函数

转载 作者:行者123 更新时间:2023-12-03 06:49:21 25 4
gpt4 key购买 nike

此代码 run on G++ ,但是 not on Visual C++ .

#include <iostream>
template<typename T> void foo( T& t,int some_parameter){}
template decltype(foo<int>) foo;
int main(){
std::cout << "Hello, world!\n";
}
这是来自 Visual C++ 的错误:-

error C2206: 'foo': typedef cannot be used for function definition


奖励:我不想为显式实例化重复函数签名。
我修改了来自 https://stackoverflow.com/a/28356212 的代码.
哪一个是错的?如何在 Visual C++ 中解决它?
当前的间接解决方法
一天后,这是我找到的最佳解决方法: https://stackoverflow.com/a/50350144 .
#include <tuple>
template<typename... Ts>auto instantiate() {
static auto funcs = std::tuple_cat(std::make_tuple(
foo1<Ts>,
foo2<Ts>
)...);
return &funcs;
}
template auto instantiate<int, double>();
但是,在 Visual C++ 中,只有在编译 foo.cpp 时才有效。打开优化:-
  • CustomDisabled(/Od)不行。
  • 使用所有 /O1 , /O2/Ox没问题。
  • 没有任何 /Od , /O1 , /O2/Ox :-
  • 刚刚/Og没问题。
  • 刚刚/Oi , /Ot , /Oy , /Ob2 , /GF/Gy不行。
  • 使用上面两行中的所有标志是可以的。


  • 变通方法 (与 /Od 合作):调用 std::tuple_size<decltype(instantiate<int, double>())>在 .cpp 中的虚拟函数内。然后在头文件中声明虚拟函数。

    最佳答案

    我相信 msvc 是错误的。简而言之,显式实例化只是一个 template其次是您的典型声明。
    如果你遵循语法 [temp.explicit]

    explicit-instantiation:
    template declaration
    declaration:
    block-declaration
    block-declaration:
    simple-declaration
    simple-declaration:
    decl-specifier-seq init-declarator-list;
    decl-specifier-seq:
    decl-specifier
    decl-specifier:
    defining-type-specifier
    defining-type-specifier:
    simple-type-specifier
    simple-type-specifier:
    decltype-specifier
    decltype-specifier:
    decltype ( expression )
    我不相信有解决办法。显然,msvc 认为 decltype作为类型别名,并拒绝任何带有别名签名的“感知”定义。这些也被拒绝
    using F = decltype(foo<int>);
    template F foo;
    extern template F foo; // not even a definition
    然而它接受这些
    F bar;
    decltype(foo<int>) baz;

    关于c++ - 使用 decltype : work on g++ but not on Visual C++ 显式实例化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63989585/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com