问问题
146 次
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 回答