相关疑难解决方法(0)

SFINAE方法完全禁用了clang中的基类模板方法

#include <iostream>
#include <utility>

struct B {
    template<typename T, std::enable_if_t<std::is_same<T, int>::value>* = nullptr>
    void foo(T) {
        std::cout<<"B::foo"<<std::endl;
    }
};

struct D: B {        
    using B::foo;
    template<typename T, std::enable_if_t<std::is_same<T, std::string>::value>* = nullptr>
    void foo(T) {
        std::cout<<"D::foo"<<std::endl;
    }
};

int main() {
    D d;
    d.foo(2); // gcc: print "B::foo"; clang: compile error
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

假设我们想foo()在派生类D中公开两个重载.gcc和Visual Studio编译并按照我的预期打印"B :: foo".但我得到一个与clang编译错误:

prog.cc:22:7: error: no matching member function for call to 'foo'
    d.foo(2);
    ~~^~~
prog.cc:14:10: note: candidate template ignored: requirement 'std::is_same<int, std::string>::value' was …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang language-lawyer c++11

7
推荐指数
1
解决办法
110
查看次数

标签 统计

c++ ×1

c++11 ×1

clang ×1

gcc ×1

language-lawyer ×1