接続数

COUNTER379431FROM 2012/5/16

MISRA-C diary(C言語日誌)

MISRA-C >> Article details

2014/06/17

cpp2011//14.7.1 Implicit instantiation

Tweet ThisSend to Facebook | by kaizen

// 1 filename:cpp2011-14-7-1.cpp

// ver 0.1 June.15, 2014

//

// 2 original examples and/or notes:

// (c) ISO/IEC JTC1 SC22 WG21 N3242, April 12, 2011

// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf

// >14 Templates 14.7 Template instantiation and specialization 14.7.1 Implicit instantiation

// (c) Dr. OGAWA Kiyoshi, kaizen at gifu-u.ac.jp,

//

// 4 compile errors and/or warnings:

// 4.1(c) Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)

// Target: x86_64-apple-darwin13.2.0,  Thread model: posix

// Command/Options: c++ -std=c++11 -stdlib=libc++ -Wall cpp2011-14-7-1.cpp

// (c) LLVM 2003-2009 University of Illinois at Urbana-Champaign.


// 4.2. g++-4.9 (GCC) 4.9.0 20131229 (experimental)

// Copyright (C) 2013 Free Software Foundation, Inc.

// This is free software; see the source for copying conditions.  

// There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

// http://gcc.gnu.org/onlinedocs/gcc/Standards.html

// Command/Options: g++-4.9  -std=c++11  -Wall cpp2011-14-7-1.cpp 

// g++-4.9: error: unrecognized command line option '-stdlib=libc++'

// Configuration:brew install gcc49

//

// 4.3. Visual Studio Express 2013, 

// (c) Microsoft http://www.visualstudio.com/

// SPEC:

// Windows 7, .NET Framework

// (c) VMware, Inc.

// VMWare fusion 6

//

// 5. Hardware:  MacBook Pro, 

//(c) Intel http://ark.intel.com/products/37006/

//Core 2 Duo 2.53GHz, 8GB, 1067MHz DDR3

//

// 6. Special Thanks: Upper organizatios and 

// ITSCJ/IPSJ http://www.itscj.ipsj.or.jp/itscj_english/index.html

// Renesas Electronics Corporation.http://www.renesas.com/

// NPO SESSAME project, http://www.sessame.jp/workinggroup/WorkingGroup3/

// Toyo Corporation, http://www.toyo.co.jp/English/

// Japan Standard Association, http://bit.ly/1lzykg1

// NPO TOPPERS project, https://www.toppers.jp/asp-d-download.html

// Daido Universcity, http://www.daido-it.ac.jp/gakubugakka/computer/index.html

// WITZ Co.Ltd., http://www.witz-inc.co.jp/products/solution/solution.html

// SevenWise.co., http://www.7ws.co.jp/index.html

// TOYOTA Motor Corporation, http://toyota.jp/

// IT planning Inc., http://www.itpl.co.jp/en/index.html

// DENSO Corporation, http://www.globaldenso.com/en/

// Aisin Seiki co. Ltd., http://www.aisin.com/

// Spancion Inc., http://www.spansion.com/

// Yazaki Corporation, http://www.yazaki-group.com/global/

// Pananosic Corporation, http://www.panasonic.net/

// SWEST: Summer Workshop on Embedded System Technologies , http://swest.toppers.jp

// CEST: Consortium for Embedded System Technology, http://www.ertl.jp/CEST/

// JUSE: Union of Japanese Scientists and Engineers, http://www.juse.or.jp/e/

// OSC:Open Source Conference, http://www.ospn.jp/


#include <iostream>

#include <cstdlib>

#include <string.h>

#include <cstring>

#include <type_traits>

#include <cassert>

#include <algorithm>

#include <cmath>

#include <complex>

#include <ccomplex>

#include <cstddef>

#include <new>

#include <vector>

#include <valarray>


using namespace std;


template<class T> struct Z {

void f();

void g();

};

void h() {

Z<int> a; // instantiation of class Z<int> required

Z<char>* p; // instantiation of class Z<char> not required

Z<double>* q; // instantiation of class Z<double> not required

a.f(); // instantiation of Z<int>::f() required

p->g(); // instantiation of class Z<char> required, and

// instantiation of Z<char>::g() required

}

//

template<class T> class B { /* ... */ };

template<class T> class D : public B<T> { /* ... */ };

void f(void*);

void f(B<int>*);

void g(D<int>* p, D<char>* pp, D<double>* ppp) {

f(p); // instantiation of D<int> required: call f(B<int>*)

B<char>* q = pp; // instantiation of D<char> required:

// convert D<char>* to B<char>*

delete ppp; // instantiation of D<double> required

}

//

template <class T> struct S {

operator int();

};

void f(int);

void f(S<int>&);

void f(S<float>);

void g(S<int>& sr) {

f(sr); // instantiation of S<int> allowed but not required

// instantiation of S<float> allowed but not required

};

//

template<class T> class X;

//error: X<char> ch; // error: definition of X required

//

namespace N {

template<class T> class List {

public:

T* get();

};

}

template<class K, class V> class Map {

public:

N::List<V> lt;

V get(K);

};

void g(Map<const char*,int>& m) {

int i = m.get("Nicholas");

}

//

template<class T> void f(T x, T y = ydef(T()), T z = zdef(T()));

class A { };

A ydef(A);

A zdef(A);

void g(A a, A b, A c) {

f(a, b, c); // no default argument instantiation

f(a, b); // default argument z = zdef(T()) instantiated

f(a); // ill-formed; ydef is not declared

}

//

template<class T> class X {

X<T>* p; // OK

X<T*> a; // implicit generation of X<T> requires

// the implicit instantiation of X<T*> which requires

// the implicit instantiation of X<T**> which ...

};


int main() {

//

cout << "14 Templates 14.7 Template instantiation and specialization 14.7.1 Implicit instantiation" << std::endl;

return 0;

}

// 1 output

// c++ -std=c++11 -stdlib=libc++  -Wall cpp2011-14-7-1.cpp

cpp2011-14-7-1.cpp:82:12: warning: unused variable 'q' [-Wunused-variable]

Z<double>* q; // instantiation of class Z<double> not required

           ^

cpp2011-14-7-1.cpp:84:1: warning: variable 'p' is uninitialized when used here [-Wuninitialized]

p->g(); // instantiation of class Z<char> required, and

^

cpp2011-14-7-1.cpp:81:11: note: initialize the variable 'p' to silence this warning

Z<char>* p; // instantiation of class Z<char> not required

          ^

           = nullptr

cpp2011-14-7-1.cpp:94:10: warning: unused variable 'q' [-Wunused-variable]

B<char>* q = pp; // instantiation of D<char> required:

         ^

cpp2011-14-7-1.cpp:125:5: warning: unused variable 'i' [-Wunused-variable]

int i = m.get("Nicholas");

    ^

4 warnings generated.

Undefined symbols for architecture x86_64:

  "void f<A>(A, A, A)", referenced from:

      g(A, A, A) in cpp2011-14-7-1-4766d6.o

  "f(B<int>*)", referenced from:

      g(D<int>*, D<char>*, D<double>*) in cpp2011-14-7-1-4766d6.o

  "f(S<int>&)", referenced from:

      g(S<int>&) in cpp2011-14-7-1-4766d6.o

  "ydef(A)", referenced from:

      g(A, A, A) in cpp2011-14-7-1-4766d6.o

  "zdef(A)", referenced from:

      g(A, A, A) in cpp2011-14-7-1-4766d6.o

  "Z<char>::g()", referenced from:

      h() in cpp2011-14-7-1-4766d6.o

  "Z<int>::f()", referenced from:

      h() in cpp2011-14-7-1-4766d6.o

  "Map<char const*, int>::get(char const*)", referenced from:

      g(Map<char const*, int>&) in cpp2011-14-7-1-4766d6.o

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

// 1.2 gcc: g++-4.9 -std=c++11 -Wall cpp2011-14-7-1.cpp 

cpp2011-14-7-1.cpp: In function 'void h()':

cpp2011-14-7-1.cpp:82:12: warning: unused variable 'q' [-Wunused-variable]

 Z<double>* q; // instantiation of class Z<double> not required

            ^

cpp2011-14-7-1.cpp: In function 'void g(D<int>*, D<char>*, D<double>*)':

cpp2011-14-7-1.cpp:94:10: warning: unused variable 'q' [-Wunused-variable]

 B<char>* q = pp; // instantiation of D<char> required:

          ^

cpp2011-14-7-1.cpp: In function 'void g(Map<const char*, int>&)':

cpp2011-14-7-1.cpp:125:5: warning: unused variable 'i' [-Wunused-variable]

 int i = m.get("Nicholas");

     ^

cpp2011-14-7-1.cpp: In function 'void h()':

cpp2011-14-7-1.cpp:84:7: warning: 'p' may be used uninitialized in this function [-Wmaybe-uninitialized]

 p->g(); // instantiation of class Z<char> required, and

       ^

Undefined symbols for architecture x86_64:

  "void f<A>(A, A, A)", referenced from:

      g(A, A, A)  in ccigpdYG.o

  "f(B<int>*)", referenced from:

      g(D<int>*, D<char>*, D<double>*) in ccigpdYG.o

  "f(S<int>&)", referenced from:

      g(S<int>&)  in ccigpdYG.o

  "ydef(A)", referenced from:

      g(A, A, A)  in ccigpdYG.o

  "zdef(A)", referenced from:

      g(A, A, A)  in ccigpdYG.o

  "Z<char>::g()", referenced from:

      h()    in ccigpdYG.o

  "Z<int>::f()", referenced from:

      h()    in ccigpdYG.o

  "Map<char const*, int>::get(char const*)", referenced from:

      g(Map<char const*, int>&) in ccigpdYG.o

ld: symbol(s) not found for architecture x86_64

collect2: error: ld returned 1 exit status



23:20 | Impressed! | Voted(0) | Comment(0)