0
4

2 回答 2

2

在 C++11 和 C++14 中,指针/引用模板参数必须引用具有链接的实体(在 C++03 中,它们仅限于具有外部链接的实体)。本地类没有链接,它的成员函数也没有。

N4268在 C++17 中删除了这个限制,并且 GCC 主干声称已经实现了该论文,但显然不是链接部分。

回避这个问题需要不使用&U::baseUnitConversionFactor模板非类型参数。T::baseUnitConversionFactor()令人高兴的是,测试表达式是否有效并准确返回的一种更简单的方法double是:

template <typename T, class=double>
struct has_baseUnitConversionFactor : std::false_type { };

template <typename T>
struct has_baseUnitConversionFactor<T, decltype(T::baseUnitConversionFactor())>
         : std::true_type { };

这确实取决于表达式 SFINAE(但是,原来的也是如此),所以我不确定它是否适用于 MSVC 2013。

对于更一般的检查,您可能需要查看std::experimental::is_detected_convertible. 该 cppreference 页面有一个参考实现。

于 2015-12-28T22:13:35.130 回答
0

令人讨厌的是,这个问题似乎是由 gtest 使用匿名命名空间的方式引起的。将validUnit声明移动到测试夹具(称为 UnitsTest)并更改 EXPECT 语句以使用夹具命名空间解决了该问题。

更新的夹具

class UnitsTest : public ::testing::Test {
protected:

    UnitsTest()
    {

    }

    virtual ~UnitsTest()
    {

    }

    virtual void SetUp()
    {

    }

    virtual void TearDown()
    {

    }

    struct validUnit
    {
        static inline double baseUnitConversionFactor() { return 0.0; }
        typedef void unit_category;
        typedef void base_unit_type;
    };
};

更新测试

TEST_F(UnitsTest, conceptChecker)
{
    EXPECT_TRUE(has_baseUnitConversionFactor<UnitsTest::validUnit>::value);
}
于 2015-12-28T22:03:21.503 回答