什么c ++语法适用于实现嵌套类的函数,使用pass enum param作为模板参数?

时间:2014-05-29 16:25:48

标签: c++ templates enums g++ clang

确定。这里代码:

#include <iostream>

using namespace std;

template<typename T>
struct A {    
    enum Status {
        one = 1
    };

    template< Status status >
    struct C;
};

template<typename T>
template<typename A<T>::Status status >
struct A<T>::C {
    void operator()() {
        cout << "C: " << (int)status << endl;
    };

//    void operator()();
};

// template<typename T>
// template<typename A<T>::Status status >
// void A<T>::C<status>::operator()() {
//    cout << "C: " << status << endl;
//}

int main()
{   
    A<int>::C<A<int>::one> c;
    c();

    return 0;
}

它适用于clang和g ++ - 编译并运行。

但是,如果注释内联实现A :: C :: operator()(),并取消注释注释声明和out实现:

#include <iostream>

using namespace std;

template<typename T>
struct A {    
    enum Status {
        one = 1
    };

    template< Status status >
    struct C;
};

template<typename T>
template<typename A<T>::Status status >
struct A<T>::C {
//    void operator()() {
//        cout << "C: " << (int)status << endl;
//    };

    void operator()();
};

template<typename T>
template<typename A<T>::Status status >
void A<T>::C<status>::operator()() {
    cout << "C: " << status << endl;
}

int main()
{   
    A<int>::C<A<int>::one> c;
    c();

    return 0;
}

clang没有做到这一点:

$ clang++ -std=c++11 main.cpp && ./a.out
main.cpp:28:23: error: nested name specifier 'A<T>::C<status>::' for declaration does not refer into a class, class template or class template partial specialization
void A<T>::C<status>::operator()() {
     ~~~~~~~~~~~~~~~~~^
1 error generated.

但是g ++确实有效:

$ g++-4.8 -std=c++11 -O2 -Wall -pedantic -pthread main.cpp
C: 1

我尝试在工作PC上使用Visual C ++ 2010编译代码,但两个示例都失败了。我现在无法验证它(没有Windows PC),我不确定 - 也许我犯了其他错误......

第二个样本中的错误以及适用于实现的语法是什么?

1 个答案:

答案 0 :(得分:0)

在我看来,你只是忘记了struct C的实现中的模板参数。 以下固定代码在Visual C ++ 2010中编译文件:

#include <iostream>
#include <string>
#include <sstream>
#include <iostream>

using namespace std;

template<typename T>
struct A {    
    enum Status {
        one = 1
    };

    template< Status status >
    struct C;
};

template<typename T>
template<typename A<T>::Status status >
struct A<T>::C<status> {
    /*void operator()() {
        cout << "C: " << (int)status << endl;
    };*/

    void operator()();
};

template<typename T>
template<typename A<T>::Status status >
void A<T>::C<status>::operator()() {
    cout << "C: " << status << endl;
}

int main()
{   
    A<int>::C<A<int>::one> c;
    c();

    return 0;
}