相关疑难解决方法(0)

我必须在何处以及为何要使用"模板"和"typename"关键字?

在模板,在那里,为什么我必须把typenametemplate上依赖的名字呢?究竟什么是依赖名称?我有以下代码:

template <typename T, typename Tail> // Tail will be a UnionNode too.
struct UnionNode : public Tail {
    // ...
    template<typename U> struct inUnion {
        // Q: where to add typename/template here?
        typedef Tail::inUnion<U> dummy; 
    };
    template< > struct inUnion<T> {
    };
};
template <typename T> // For the last node Tn.
struct UnionNode<T, void> {
    // ...
    template<typename U> struct inUnion {
        char fail[ -2 + (sizeof(U)%2) ]; // Cannot be instantiated for any …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++-faq dependent-name typename

1061
推荐指数
8
解决办法
15万
查看次数

将typename关键字与typedef和new一起使用

考虑一下这段代码

template<class T>
struct Sample
{ 
     typename T::X *x; //declare pointer to T's X
};
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,typename编译器需要关键字,以便它可以消除模板中嵌套类型和嵌套值之间的歧义.这意味着,在没有typename关键字的情况下,编译器会将此解释为T :: X与x的乘法,

T::X *x; //multiply T::X with x
Run Code Online (Sandbox Code Playgroud)

因此,在可能出现歧义的情况下,关键字typename变得必要,以便消除歧义.但是,上下文本身消除歧义的情况很少.在其它主题讨论基类和函数参数的上下文(后者不虽然除去模糊).在这个主题中,我特别想讨论其他两个似乎毫不含糊的背景,但我们仍然需要写typename,

typedef typename T::X xtype;
pX = new typename T::X;  
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,关键字typedefnew使其足够清楚,无论遵循编译器类型,不是 .

所以我的问题是,为什么编译器仍然需要typename关键字,即使在明确的情况下,例如我们使用typedefnew


编辑(阅读Johannes Schaub的回复后):

//typedef NOT followed by a type!
int typedef A;
Run Code Online (Sandbox Code Playgroud)

这种语法要求我稍微修改一下我的问题,以便我试图做出的观点可能会被其他人看到.

想想这个, …

c++ templates typedef typename language-lawyer

20
推荐指数
2
解决办法
1万
查看次数

继承自enable_if'd基础

我试图为非字符数组部分特化一个特征:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]>
: std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {};
Run Code Online (Sandbox Code Playgroud)

Visual Studio 2010给了我一个C2039(type不是enable_if......的元素).但是,SFINAE不应该只是在这里触底而不是给出编译错误吗?或者SFINAE在这种情况下不适用?

当然,我可以将非char和char的特化分开:

template<typename T>
struct is_container : std::false_type {};

template<typename T, unsigned N>
struct is_container<T[N]> : std::true_type {};

template<unsigned N>
struct is_container<char[N]> : std::false_type {};
Run Code Online (Sandbox Code Playgroud)

但我真的想知道为什么SFINAE在这种特殊情况下不起作用.

c++ templates sfinae enable-if template-meta-programming

6
推荐指数
1
解决办法
1096
查看次数

模板化模拟类中的MOCK_METHODx()定义缺少'typename'

我有一个gmock的编译器错误问题和一个模板化的mock类,它应该用作派生(具体)模拟类的基础.

目的是测试框架支持的回调方法,但框架基类依赖于最终实现(简而言之,它是一个注入静态接口声明的CRTP模式样式框架) -

我正试图勾勒出我所拥有的东西(请不要依赖于第一次尝试的可编译代码):

这是依赖于Context模板参数的框架钩子接​​口定义,框架基类本身将其作为非多态调用处理,并提供默认实现:

template<class Context>
class IFrameworkHooks
{
public:
    virtual void funcImpl(Context* context) = 0;
    virtual ~IFrameworkHooks() {}
};
Run Code Online (Sandbox Code Playgroud)

现在我想实现一个实现IFrameWorkHooks<>接口的mock类:

template<class Context, class InnerInterface>
class MyTemplateMock
: public FrameworkBaseClass<MyTemplateMock<Context,InnerInterface>,Context,InnerInterface>
, public IFrameworkHooks<Context>
{
public:
    // Compiler error here:
    MOCK_METHOD1(funcImpl, void (Context* context));
    virtual ~MyTemplateMock() {}

protected:
    MyTemplateMock()
    {
        // Compiler error here:
        ON_CALL(*this, funcImpl(_))
            .WillByDefault(Invoke(this, &MyTemplateMock<Context,InnerInterface>::funcImplCall));
    }

    void funcImplCall(Context* context)
    {
    }

};
Run Code Online (Sandbox Code Playgroud)

我收到一个编译错误,说:

error: need ‘typename’ before ‘testing::internal::Function<void(Context*)>::Result’ because ‘testing::internal::Function<void(Context*)>’ is a dependent scope
error: …
Run Code Online (Sandbox Code Playgroud)

c++ gmock

3
推荐指数
1
解决办法
805
查看次数